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完成执行...所以我问我该怎么做才能解决????
答案 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();