2014-01-29 51 views
0

我有兩個線程:C和D.如果我想線程C-先執行,那麼線程d,這是我必須做的:如何讓一個線程等待另一個線程?

這是ThreadC類代碼:

public class ThreadC implements Runnable { 

    int isi[] = new int[100]; 

    public void run() { 
     for (int i = 0;i < isi.length; i++) { 
      isi[i] = i; 
      System.out.print(isi[i] + " "); 
     } 
    } 
} 

這爲ThreadD類代碼:

public class ThreadD implements Runnable { 

    int temp=0; 

    public void run() { 
     for(int i = 0; i < 1000; i++) 
      temp += i; 
     System.out.println("nilai temp : " + temp); 
    } 
} 

這是主要的方法:

public class main { 
    public static void main (String[] args) { 
     ThreadC tc = new ThreadC(); 
     Thread t1 = new Thread(tc); 
     t1.start(); 
     ThreadD td = new ThreadD(); 
     Thread t2 = new Thread(td); 
     t2.start(); 
    } 
} 

編輯:

我其實有問題,我有課。首先我打電話給ThreadC。我想要線程C完成執行,然後線程將執行。然後我打電話給ThreadD。它像下面的代碼:

for (int j = 0; j < idW.length; j++) { 
    webtext = d.getWebText(idW[j]); 
    ThreadPrepo tpo = new ThreadPrepo(webtext, host[j%jumhost], "server", 1099, idW[j]); 
    Thread t1 = new Thread(tpo); 
    t1.start(); 

} 
ThreadD td = new ThreadD; 
Thread t2 = new Thread(t2); 
t2.start(); 

所以ThreadD T2將線程T1完成執行後執行,因此線程T2必須等到T1哈希完成。

我該如何解決這個問題?

+1

如果它是'Runnable',則不要將其稱爲線程。在你的兩個'Runnable'實例之間同步你的'run()'方法代碼。第一個輸入塊將首先執行並完成。 –

+1

爲什麼大家試圖用線程做的第一件事就是首先破壞線程的整個觀點? –

+0

我從來不理解這些問題。如果你想順序執行,爲什麼你使用線程呢? – EJP

回答

1

使用Thread.join()。加入一個線程將等待它完成。如果你想t2t1後運行,下面的代碼片段將做到這一點:

t1.start(); 
t1.join(); // blocks until t1 is complete 
t2.start(); 

編輯:爲了澄清,如果你真的只有兩個線程這樣的,不這樣做 - 不需要螺紋和可運行可以順序運行。如果您有多個線程同時運行,並且需要在運行其他代碼之前等待它們完成(線程完成後的代碼不需要在線程中運行),那麼聯合運行良好。

+3

然後你會想:爲什麼我應該在這裏使用多個線程? –

+1

我同意。我正在回答所問的問題。在這種情況下,如果你真的只有兩個這樣的線程,爲什麼要使用線程。但是,如果你想在繼續之前等待多個線程。 –

+0

這只是一個例子,因爲我有類在多線程的過程中......我想在類中有多線程完成的過程首先完成(我的意思是類與threadC),然後程序將在類中的代碼ThreadD..so我問像上面... – zorro

0

除了Jeff的回答,java.util.concurrent還有很多選項。

CountDownLatch或Semaphore會實現這一點。使用Runnables,您可以使用threadPoolExecutor,其線程池大小爲1。

如果你不希望他們同時運行,它可能是有意義的只是創建一個線程

例如,使用一個線程池執行

ExecutorService executor = Executors.newFixedThreadPool(1); 
executor.execute(new ThreadC()); 
executor.execute(new ThreadD()); 
+0

可以舉例代碼@Edh,所以我會更undertad ..感謝 – zorro

0

不要使用線程都。只需按照所需順序運行Runnables:

ThreadC tc=new ThreadC(); 
    tc.run(); 
    ThreadD td=new ThreadD(); 
    td.run(); 
+0

但是,如果他真的想要在單獨的線程中執行代碼那麼是什麼? –

+0

@ user1590011然後,很明顯,不要這樣做。他還沒有說服我。他真正想要的是D在C之後執行。我不明白爲什麼在單個線程中運行它們都不能滿足要求。 – EJP

+0

感謝您的評論和回答所有....我倒下了幫助:D – zorro

相關問題