如何让一个线程等待另一个线程?第2章

时间:2014-01-29 08:26:56

标签: java multithreading

实际上我有这个问题...我有类首先我调用线程t1..i想要线程t1完成执行然后线程t2在循环下将执行..我调用是线程t2..like代码如下:

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]);//hozstnya  
     Thread t1 = new Thread(tpo);
     t1.start();

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

所以ThreadD t2将在线程t1完成执行后执行。所以线程t2必须等到t1完成执行...所以我问我该怎么做才能解决????

5 个答案:

答案 0 :(得分:1)

您需要将对t1的引用传递给t2,而t2正在运行的代码需要调用t1.join()

答案 1 :(得分:0)

使用synchronized方法或语句来解决这个问题,其中一个线程的更改保证第二个更新。 http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

答案 2 :(得分:0)

请勿使用原始Thread,请使用ExecutorService

final int[] idW = null;
final ExecutorService es = Executors.newCachedThreadPool();
final Collection<Future<?>> fs = new LinkedList<>();
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]);
    fs.add(es.submit(tpo));
}
for (final Future<?> f : fs) {
    f.get();
}
final Future<?> f2 = es.submit(t2);
es.shutdown();

将所有第一组任务提交给服务,这将返回Future。保持期货,因为他们处理任务。

接下来循环期货并调用get() - 这将等待该任务完成。完成此循环后,所有任务都完成。

最后将其他任务提交给服务。

提交最后一个任务后不要忘记shutdown()服务,这将导致它在上次提交的任务完成时终止它创建的所有线程。

有很多tutorials on the internet更详细地解释了ExecutorService API。

答案 3 :(得分:0)

使用倒计时锁存器

private CountDownLatch _latch= new CountDownLatch(idW.length);

 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], _latch);//hozstnya  
    Thread t1 = new Thread(tpo);
    t1.start();
  }
  _latch.await();
  ThreadD td=new ThreadD();
  Thread t2=new Thread(td);
  t2.start();

在run()方法结束时将_latch传递给循环线程_latch.countdown()的run()函数。

答案 4 :(得分:-1)

在线程t1上使用join方法,以便执行将等到t1的执行完成。

t1.join();