Итак, прежде всего вам нужно создать экземпляр Delayed, это очень простая реализация, которая с помощью переключателя флага может в основном инвертировать порядок ожидания в списке. (И добавьте подходящее смещение, чтобы все происходило в правильном порядке
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
static int COUNT=100; class DelayedSwap implements Delayed, Comparable<Delayed> { int index = 0; volatile boolean swap = false; long starttime; public DelayedSwap(int index, long starttime) { super(); this.index = index; this.starttime = starttime; } private long getDelay() { return (swap ? starttime + (2*COUNT - index) * 100 : starttime + index * 100) - System.currentTimeMillis(); } public String toString() { return index + ' swapped ' + swap + ' delay ' + getDelay(); } @Override public long getDelay(TimeUnit unit) { return unit.convert(getDelay(), TimeUnit.MILLISECONDS); } @Override public int compareTo(Delayed delayed) { if (delayed == this) return 0; return (int)(getDelay(TimeUnit.MILLISECONDS) - delayed.getDelay(TimeUnit.MILLISECONDS)); } } |
Поэтому, чтобы проверить это, я создал метод, который создавал бы кучу объектов DelayedSwap и в середине обработки списка переключал флаг, изменяя порядок истечения срока действия.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public static void main(String[] args) throws InterruptedException { long start = System.currentTimeMillis(); final List delayed = new ArrayList (); for (int i = 1; i < COUNT; i++) { delayed.add(new DelayedSwap(i, start)); } final DelayQueue dq = new DelayQueue(); dq.addAll(delayed); new Thread(new Runnable() { @Override public void run() { try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { } for (DelayedSwap d : delayed) { d.swap = true; } } }).start(); while (!dq.isEmpty()) { System.out.println(dq.take()); } } |
Так что я ожидал, что элементы 1-50 ish записаны в правильном порядке, но вместо этого после перестановки элементы выходят в произвольном порядке довольно далеко от времени задержки запроса.
|
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
|
1 swapped false delay -192 swapped false delay -43 swapped false delay -44 swapped false delay -45 swapped false delay -46 swapped false delay -47 swapped false delay -48 swapped false delay -49 swapped false delay -410 swapped false delay -411 swapped false delay -412 swapped false delay -413 swapped false delay -414 swapped false delay -415 swapped false delay -416 swapped false delay -417 swapped false delay -418 swapped false delay -419 swapped false delay -420 swapped false delay -421 swapped false delay -422 swapped false delay -423 swapped false delay -424 swapped false delay -425 swapped false delay -426 swapped false delay -427 swapped false delay -428 swapped false delay -429 swapped false delay -430 swapped false delay -431 swapped false delay -432 swapped false delay -433 swapped false delay -434 swapped false delay -435 swapped false delay -436 swapped false delay -437 swapped false delay -438 swapped false delay -439 swapped false delay -540 swapped false delay -441 swapped false delay -442 swapped false delay -543 swapped false delay -444 swapped false delay -545 swapped false delay -546 swapped false delay -547 swapped false delay -548 swapped false delay -549 swapped false delay -550 swapped false delay -551 swapped true delay -694 swapped true delay -430696 swapped true delay -450687 swapped true delay -360691 swapped true delay -400697 swapped true delay -460695 swapped true delay -440698 swapped true delay -470692 swapped true delay -410682 swapped true delay -310680 swapped true delay -290690 swapped true delay -390693 swapped true delay -420674 swapped true delay -230699 swapped true delay -480670 swapped true delay -190669 swapped true delay -180666 swapped true delay -150683 swapped true delay -320662 swapped true delay -110761 swapped true delay -100758 swapped true delay -70771 swapped true delay -200789 swapped true delay -380785 swapped true delay -340778 swapped true delay -270786 swapped true delay -350781 swapped true delay -300788 swapped true delay -370784 swapped true delay -330779 swapped true delay -280776 swapped true delay -250772 swapped true delay -210768 swapped true delay -170765 swapped true delay -140760 swapped true delay -90757 swapped true delay -60855 swapped true delay -40875 swapped true delay -240877 swapped true delay -260873 swapped true delay -220863 swapped true delay -120867 swapped true delay -160864 swapped true delay -130859 swapped true delay -80856 swapped true delay -50854 swapped true delay -30853 swapped true delay -20852 swapped true delay -108Process exited with exit code 0. |
Таким образом, хитрость в том, что когда вы знаете, что собираетесь изменить задержку, нужно удалить, а затем повторно добавить элемент в очередь.
|
1
2
3
4
5
6
7
8
|
// Replacement swap loop for (DelayedSwap d : delayed) { if (dq.remove(d)) { d.swap = true; dq.add(d); } } |
Этот прогон дает более разумный набор результатов:
|
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
|
1 swapped false delay -42 swapped false delay -83 swapped false delay -144 swapped false delay -85 swapped false delay -46 swapped false delay -47 swapped false delay -48 swapped false delay -49 swapped false delay -410 swapped false delay -411 swapped false delay -412 swapped false delay -413 swapped false delay -414 swapped false delay -415 swapped false delay -416 swapped false delay -417 swapped false delay -418 swapped false delay -819 swapped false delay -420 swapped false delay -421 swapped false delay -422 swapped false delay -423 swapped false delay -424 swapped false delay -425 swapped false delay -426 swapped false delay -427 swapped false delay -428 swapped false delay -429 swapped false delay -430 swapped false delay -431 swapped false delay -432 swapped false delay -433 swapped false delay -434 swapped false delay -435 swapped false delay -436 swapped false delay -437 swapped false delay -438 swapped false delay -439 swapped false delay -540 swapped false delay -541 swapped false delay -542 swapped false delay -443 swapped false delay -444 swapped false delay -545 swapped false delay -546 swapped false delay -547 swapped false delay -548 swapped false delay -549 swapped false delay -550 swapped false delay -599 swapped true delay -598 swapped true delay -597 swapped true delay -1196 swapped true delay -195 swapped true delay -594 swapped true delay -993 swapped true delay -592 swapped true delay -591 swapped true delay -590 swapped true delay -589 swapped true delay -588 swapped true delay -587 swapped true delay -586 swapped true delay -585 swapped true delay -584 swapped true delay -583 swapped true delay -582 swapped true delay -581 swapped true delay -580 swapped true delay -579 swapped true delay -578 swapped true delay -577 swapped true delay -576 swapped true delay -575 swapped true delay -574 swapped true delay -573 swapped true delay -572 swapped true delay -671 swapped true delay -570 swapped true delay -569 swapped true delay -568 swapped true delay -567 swapped true delay -566 swapped true delay -565 swapped true delay -564 swapped true delay -563 swapped true delay -662 swapped true delay -561 swapped true delay -660 swapped true delay -659 swapped true delay -658 swapped true delay -657 swapped true delay -656 swapped true delay -655 swapped true delay -654 swapped true delay -653 swapped true delay -652 swapped true delay -651 swapped true delay -6Process exited with exit code 0. |
Я не думаю, что это ошибка в самом объекте, так как вы не ожидаете, что HashTable упорядочит сам себя, когда ключ изменится, но меня это немного удивило.
Приятного кодирования и не забудьте поделиться!
Ссылка: Изменение задержки и, следовательно, порядка в DelayQueue от нашего партнера по JCG