我想知道JAVA多线程中,如何让一个线程去等待N个线程执行完成后,再执行。

 我来答
liupesnap
2011-03-29 · TA获得超过253个赞
知道小有建树答主
回答量:66
采纳率:0%
帮助的人:105万
展开全部
java.util.concurrent.CountDownLatch 这个类可以实现你所要的功能

例如:CountDownLatch latch = new CountDownLatch(5) //声明计数器为5个
Thread t = new Thread() {
public void run() {
try {
//TODO 你的应用
} catch (Exception e) {
//TODO 异常处理
}
finally {
latch.countDown(); //这句是关键
System.out.println("ok"); //5个线程都跑完后输出
}
}
};
t.start();
然后让以上操作循环五次(就是说同时开5个线程),那么这个"ok"就会在等到这5个线程都ok后才会被输出一次。
ccfish86
2011-04-01 · TA获得超过158个赞
知道答主
回答量:194
采纳率:100%
帮助的人:24.2万
展开全部
//1.可用ExecutorService+Future来实现,下面这个限制了最大并发线程数.也可以不限制.
//System.out.println("down");这个位置你可以放那个线程的处理,

//2.用线程锁定也可以.lock<N个线程>unlock lock<线程>unlick

package jp.co.hitachi.jkk.ekarte.hl7.bat;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
* バッチ自动実行のスレッド
* @author yuangui
* @see Runnable
* @version 0610-00, 2010/8/25
* @since 0610-00
*/
public class CSBatDEMOThread extends Thread {

public static void main(String[] args) {
Thread t = new CSBatDEMOThread();
t.start();
}

/**
* バッチ自动実行
* @return なし
*/
@Override
public void run() {

// CSBProcLock locker = CSBProcLock.createLocker();
ExecutorService es;
try{
// locker.onStart();

//int cpuNums = Runtime.getRuntime().availableProcessors();
//Process 3 threads in the pool
es = Executors.newFixedThreadPool(10);

List<Future<?>> fs = new ArrayList<Future<?>>();

for (int i = 0; i < 100; i++) {
// TODO : logic > Start

TestTask t = new TestTask();
t.setTaskNo(this.toString() + ": " + i);

// TODO : logic End
Future<?> f = es.submit(t);
fs.add(f);
}

for (Future<?> f: fs) {
f.get();
}

//After all submitted tasks are executed,shut down the ExecutorService
if (es.isTerminated()) {
es.shutdown();
}

System.out.println("down");

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
// locker.onEnd();
System.gc();
}
}

}

class TestTask implements Runnable{

String taskNo = "";

@Override
public void run() {
// TODO 自动生成されたメソッド・スタブ

Long wt = Math.round(Math.random() * 1000);
try {

Thread.sleep(wt);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}

System.out.println(taskNo + " time:" + wt + "ms");

}

/**
* taskNoを取得します。
* @return taskNo
*/
public String getTaskNo() {
return taskNo;
}

/**
* taskNoを设定します。
* @param taskNo taskNo
*/
public void setTaskNo(String taskNo) {
this.taskNo = taskNo;
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式