多线程同时调用同一个方法读取不同对象数据怎么确保多线程线程执行完之后在执行其他逻辑。

比如说有100个电表,我要读取电表的读数,我创建100个线程,都调用同一个读取参数的方法,怎么让他在读完所有电表的读数后在执行后面的其他代码。如何实现我说的这种场景,面试时被问到的

4个回答

加锁,同步锁有内置锁如 synchronized 和显式锁 如 Lock 及其子类。而且要保证所有对电表数的操作都是被同一个锁保护的。
如有兴趣,可以看看这个:Java 并发编程入门攻略

用一个容器保存你创建的线程,所有线程开始运行后写个循环,遍历调用thread.join方法,所有线程执行完后循环结束

CountdownLatch CyclicBarrier

这里最好用到线程池,今天可能去查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(){
                            }

}
//后面业务代码
。。。。。。。

还有哪不明白?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!