2014-01-29 122 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

相关问题