比如说有100个电表,我要读取电表的读数,我创建100个线程,都调用同一个读取参数的方法,怎么让他在读完所有电表的读数后在执行后面的其他代码。如何实现我说的这种场景,面试时被问到的
CountdownLatch CyclicBarrier
加锁,同步锁有内置锁如 synchronized 和显式锁 如 Lock 及其子类。而且要保证所有对电表数的操作都是被同一个锁保护的。
如有兴趣,可以看看这个:Java 并发编程入门攻略
用一个容器保存你创建的线程,所有线程开始运行后写个循环,遍历调用thread.join方法,所有线程执行完后循环结束
这里最好用到线程池,今天可能去查100个电表,明天有可能就去200个电表。用一个动态线程池:
ThreadPoolExecutor executor =
new ThreadPoolExecutor(电表数, 电表数, 200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1));
for(int i=0;i<issue;i++){
try {
UploadThead uploadThead = new UploadThead(参数);//线程要执行的方法(查表方法类)
executor.execute(uploadThead);
} catch (Exception e) {
}
}
System.out.println("主线程判断池中正活动线程数:" + executor.getActiveCount());
System.out.println("主线程判断池中已完成线程数:" + executor.getCompletedTaskCount());
//主线程等待子线程全部执行完
a:for (int j = 0; j < 查表超时时间; j++) {
if (executor.getActiveCount() <= 0) {
System.out.println("所有线程执行完毕");
executor.shutdown();
break a;//执行任务后面代码
}
try{
Thread.sleep(1000)
}catch(){
}
}
//后面业务代码
。。。。。。。
还有哪不明白?