Частичный вид станд.:: список

Вы получаете

end: 1065878
end: 2000000

Первая строка - из потока, который первым завершил свою работу. Это не должно быть точно 1M, потому что несколько потоков работают. Разумно предположить, что к тому моменту, когда один первый поток завершит добавление своего 1M, другой добавил хотя бы один.

Вторая строка всегда 2M (как вы и ожидали) из-за синхронизированного метода.

Полагаю, первый поток должен исполниться с тем числом, которое я хотел, не больше, не меньше.

Все происходило параллельно. Нити были запущены. Каждый пытался вызвать updateList: один вошел, остальные ждали. Не было приоритета относительно того, кто должен быть следующим, поэтому контроль над методом передавался среди всех работников довольно случайным образом.

Бьюсь об заклад, вы все еще думаете о последовательном выполнении :) Один поток запускает весь метод run, печатает 1M, другой берет список размером 1М и добавляет свою часть.

Чтобы лучше это понять, добавьте оператор print

private void updateList(int i) {
    synchronized (myList) {
        myList.add(i);
        System.out.println(Thread.currentThread().getName() + " added " + i);
    }
}

и уменьшите количество элементов, добавляемых к задаче, скажем, в 10.

pool-1-thread-1 added 0
pool-1-thread-1 added 1
pool-1-thread-1 added 2
pool-1-thread-1 added 3
pool-1-thread-2 added 0
pool-1-thread-2 added 1
pool-1-thread-2 added 2
pool-1-thread-2 added 3
pool-1-thread-1 added 4
pool-1-thread-1 added 5
pool-1-thread-1 added 6
pool-1-thread-1 added 7
pool-1-thread-1 added 8
pool-1-thread-1 added 9
end: 14
pool-1-thread-2 added 4
pool-1-thread-2 added 5
pool-1-thread-2 added 6
pool-1-thread-2 added 7
pool-1-thread-2 added 8
pool-1-thread-2 added 9
end: 20
7
задан Peter 19 October 2008 в 22:33
поделиться

2 ответа

Как насчет того, чтобы отсоединить часть списка, который Вы хотите отсортированный в автономный список, затем используют специализированный вид списка, затем сцепляют его назад в исходный список?

12
ответ дан 6 December 2019 в 15:36
поделиться

Да, но необходимо будет использовать сортировку слиянием.

2
ответ дан 6 December 2019 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: