Мне просто интересно, зачем это объединять потоки во втором цикле - PullRequest
1 голос
/ 18 сентября 2011

При написании кода вроде:

public class TestBasic {

    public static void print(Object o){
        System.out.println(o);
    }

    public static void main(String...strings) throws InterruptedException {
        Thread[] threads = new Thread[5];
        for(int i=0;i<5;i++){
            Thread thread = new Thread(new LittleRunner());
            thread.start();
            thread.join();
        }
    }

}

class LittleRunner implements Runnable{
    public void run() {
        for(int i=1;i<10;i++){
            TestBasic.print(Thread.currentThread().getName()+":"+i);
        }
    }
}

И вывод:

Thread-0:1
Thread-0:2
...
Thread-4:8
Thread-4:9

Что означает последовательную печать. Итак, кто-нибудь знает причину?

Большое спасибо и наилучшие пожелания.

Ответы [ 2 ]

2 голосов
/ 18 сентября 2011

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

Вам нужно запустить все потоки, прежде чем дождаться окончания первой.

1 голос
/ 18 сентября 2011

Измените основной метод на:

public static void main(String...strings) throws InterruptedException {
    Thread[] threads = new Thread[5];
    for(int i=0;i<5;i++){
        threads[i] = new Thread(new LittleRunner());
        threads[i].start();            
    }
    for(int i=0;i<5;i++){
        threads[i].join;            
    }
}

По сути, thread.start () запустит поток в фоновом режиме и будет двигаться дальше.Затем, когда вы выполняете thread.join (), выполнение будет остановлено до завершения потока.Итак, в вашей версии программы вы запускали каждый поток, а затем ожидали его завершения, прежде чем начинать следующий поток, следовательно, последовательное выполнение.

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