Так что я не совсем уверен, чего вы пытаетесь достичь в своем коде, но я подумал, что, по крайней мере, дам некоторые отзывы об этом.
Во-первых, у вас недостаточно памяти, потому что вынаходятся в циклическом цикле вызова:
map1.put(precise_time, message);
Это заполнит память очень быстро.Современные компьютеры достаточно быстры, чтобы создавать по крайней мере миллион элементов дерева в секунду .Вам нужно каким-то образом ограничить количество put
вызовов, которые вы делаете.
Далее, очень странно - разветвлять поток, чтобы вы могли interrupt()
родительский поток впозже.Вместо этого я бы сделал что-то вроде следующего, который устанавливает значение stop-at-time-millis и затем работает до достижения времени.Это полностью избавляет от Thread
.
long runUntilMillis = System.currentTimeMillis() + timeToRunMillis;
while (true) {
long now = System.currentTimeMillis();
if (now >= runUntilMillis) {
break;
}
long precise_time = ...
map1.put(precise_time, message);
}
return serializer.serialize(map1);
Некоторые другие мысли:
- Ваш
precise_time
расчет неверен.Вы не можете взять количество миллисекунд с начала эпохи и добавить их в значение System
наносекунды.Вы, вероятно, переполните long
, если я не ошибаюсь.На самом деле, расчет наносекунды был бы отрицательным значением, поэтому я не уверен, что вы пытались сделать там.Я бы просто использовал start_nanotime - System.nanoTime()
. - Вы не можете сделать
b = serializer.serialize(map1);
во внутреннем Thread
.Это даже не скомпилируется, поскольку b
должен был быть определен внутри потока или быть final
. - Я не понимаю, как
new TreeMap<Long,Message>();
во внутреннем Thread
, который простосоздайте TreeMap
, который был бы сразу помечен как мусор, поскольку вы никому его не назначали.Может быть, вы хотели использовать map1.clear()
? - Вы помещаете одинаковое значение
message
в каждый элемент TreeMap
.Не уверен, что это то, что вы хотели.