Параллельный поток wait () другой поток завершает и продолжает свою работу - PullRequest
1 голос
/ 07 февраля 2012

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

Thread1 first = new Thread1();
first.start();
while(flag==true){//start while1
first.wait();
Thread2 second = new Thread2();
second.start();
while(second.isAlive()){
Toast toast = new Toast(...WORKING IN PROGRESS...);//just show something
}
flag = false;
}//end of while1

Будет ли потокпервое ожидание до тех пор пока поток не остановится?Я просто хочу, чтобы Thread сначала приостанавливался и продолжал работать после завершения работы нитки Second.Спасибо за любую помощь

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Я думаю, что вы ищете что-то вроде этого:

class Worker implements Runnable{

    public void run(){
        int count = 0;
        while(true){
            Toast toast = new Toast(...WORKING IN PROGRESS...);//just show something
            count++;

            if(count == 10)
                break;
        }
    }
}

Затем просто передайте исполняемый файл Worker в поток:

Thread first = new Thread(new Worker());
first.start();
first.join();// waits for the first thread to finish
Thread second = new Thread(new Worker());
second.start();

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

1 голос
/ 07 февраля 2012

Предполагая, что вы пишете Java, вы можете использовать метод Thread.join (), чтобы заставить один поток ждать завершения другого. Например, если вы хотите, чтобы поток 1 ожидал завершения потока 2:

Thread Thread2 = new SomethingImplementingThread();
Thread Thread1 = new Thread(new Runnable() {
                  public Thread waitforthisone;
                  public void run() {
                     try {
                     waitforthisone.join();
                     } catch (InterruptedException e) {}
                     // Do stuff once waitforthisone has finished
                  });

Thread1.waitforthisone = Thread2;
Thread2.start();
Thread1.start(); // When thread 1 starts it will run Thread 2's join function, and thus 
                 // wait for thread 2 to exit

NB. Команда wait в вашем коде заставит запущенный поток (в данном случае ни thread1, ни thread 2, а создающий их поток) wait () [строка 4], то есть перейдет в спящий режим. В частности, ожидающий поток может быть разбужен, только если другой поток (thread1 или thread2) вызывает first.notify (). Код, который вы представили выше, никогда не пройдет строку 4. В противном случае

0 голосов
/ 07 февраля 2012

Вполне возможно синхронизировать потоки - один из моих любимых способов - с CountdownLatch - но ваш код показывает отсутствие понимания того, как их использовать.Я бы посоветовал прочитать немного больше о потоках в целом, прежде чем двигаться вперед.Потоки и параллелизм очень легко запутать по-королевски, если вы сделаете это неправильно.

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