метод соединения Java - PullRequest
       1

метод соединения Java

0 голосов
/ 09 ноября 2011

У меня проблемы с пониманием значения объединения в следующем случае:

Thread t1=new MyThread(1);
Thread t2=new MyThread(2);


t1.start();
t2.start();

t1.join();
t2.join();

вопрос такой: как я понимаю start вызывает метод run потока. таким образом, основной поток сначала проходит через запуски и, таким образом, все потоки инициализируются тогда основной поток переходит к t1.join, а это означает, что основной поток будет ждать до t1, чтобы завершить свою работу, и только затем продолжает t2.join (). Что я не понимаю, так это то, что t1, t2 уже запущены, поэтому они находятся внутри метода run. и, таким образом, результат должен быть неожиданным. я прав? так почему это получается по порядку: У меня есть следующий метод запуска:

void run(){
   for(int i=0; i<4; i++){
      System.out.println(j);
   }

}

когда j - идентификатор в конструкторе MyThread; вывод:

2 2 2 2 1 1 1 1

или 1 1 1 1 2 2 2 2

Ответы [ 4 ]

1 голос
/ 09 ноября 2011

Ваши предположения верны.Однако, если на вашем компьютере нет нескольких ядер, потоки на самом деле не работают параллельно.Только один активен в то время, и ваша операционная система заменит их через некоторое время.

Следовательно, если вы увеличите размер цикла в потоках, вы увидите, что он поменялся местами, но теперь он закончится (большую часть времени), прежде чем начнется другой поток.

1 голос
/ 09 ноября 2011

Попробуйте запустить ту же программу, увеличив предел итерации: i до 1000; а затем сравнить результаты. Результаты неожиданны, и ваше понимание верно.

0 голосов
/ 09 ноября 2011

Если вы присоединитесь к thread_1, пока thread_2 тоже выполняется и завершается раньше, чем thread_1, thread_2.join() не даст никакого эффекта, и текущий поток продолжит выполнение.И да, вы не можете ожидать никакого предсказуемого потока выполнения.

0 голосов
/ 09 ноября 2011

Метод join() сразу возвращается, когда поток мертв.Это только основной поток, который ожидает, другие запущенные потоки продолжат выполнение.Таким образом, если t2, t3, t4 уже закончили выполнение при возврате t1.join(), другие методы соединения вернутся немедленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...