2012-02-06 110 views
1

我想讓一個線程等待另一個線程完成,而不是終止它,開始第二個並創建firt線程的另一個實例。這是正確的?線程併發等待()其他線程完成並繼續工作

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 

線程會先等待直到第二個線程停止運行?我只想讓線程先暫停,並在線程第二次運行完成後繼續工作。感謝您的幫助

回答

0

完全有可能同步線程 - 我最喜歡的方式之一是CountdownLatch - 但您的代碼顯示對如何使用它們缺乏瞭解。在推進之前,我建議讀一些關於線程的內容。如果你做錯了,線程和併發很容易搞砸。

1

我認爲你在尋找這樣的事情:

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(); 

也請注意,除非你犯了一個類中調用WorkerWorker2,那些將不存在。但是,執行一個線程幾乎沒有什麼理由,等待它完成,然後執行另一個線程:它完全違背了併發的目的,您可能只需按順序執行代碼。

1

假設您正在編寫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 

注意:在你的代碼等待命令將導致線程運行(在這種情況下,既沒有線程1或線程2,但線程創建他們)等待()[第4行],即進入睡眠狀態。具體而言,如果另一個線程(thread1或thread2)調用first.notify(),則線程等待只能被喚醒。上面介紹的代碼將永遠不會超過第4行。

+0

我在解釋自己很糟糕。我啓動了一個線程,每隔2/3秒連接一臺服務器,檢查是否有消息給他,說它仍然可以作爲客戶端使用,因爲它也提供服務。它工作正常。現在我使用onclickListener實現了一個按鈕,我想暫停該線程並啓動另一個想要連接到服務器的人發送請求(例如要轉換的位圖)。這個線程在發送請求並收到答案之後,就停止。現在我想讓第一個線程繼續檢查客戶端是否有結果或數據。 – 2012-02-06 23:33:14

+0

thead 1應該永遠不會死亡,除非使用按鈕退出,而我在false上設置它的標誌,並使用finish()關閉mainActivity線程。 – 2012-02-06 23:38:53