18455783050 2019-12-05 14:38 采纳率: 0%
浏览 219
已结题

两个问题,1、是线程一直没有结束,2、System.out.println("--------------dataNum = " + dataNum);这句输出的值也不争确,请指教.

public class T05_ThreadPool {
public static void main(String[] args) throws InterruptedException {
ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>();
for (int i = 0; i < 10000; i++) {
queue.offer(i);
}
AtomicInteger dataNum = new AtomicInteger(0);
ExecutorService service = Executors.newFixedThreadPool(8); //execute submit
int queueSize = queue.size();
for (int i = 0; i < queueSize; i++) {
service.execute(new Runnable(){
@Verride
public void run(){
try{
if(!queue.isEmpty()){
System.out.println("-------" + queue.poll() + "-------");
TimeUnit.MILLISECONDS.sleep(500);
dataNum.addAndGet(1);
}else{
service.shutdown();
System.out.println("--------------dataNum = " + dataNum);
}

                    }catch(Exception e){
                        e.printStackTrace();
                        service.shutdown();
                }
            }
        });
    }

    System.out.println(service);
}

}

  • 写回答

2条回答 默认 最新

  • 轻点 别打脸 2019-12-05 16:16
    关注

    队列中一共一万个元素,你建立了一个线程池,8个线程,循环一万次也始终是这8个线程在处理,最后一个元素被某一个线程处理完后,队列虽然为空了,但你的for循环也完了,没有调用shutdown结束线程,多循环一次就可以了。
    输出结果不对,你在service.shutdown();前面加一个线程休眠,让执行中的线程执行完毕,结果自然就对了,线程shutdown是立即执行,即使有正在执行中的线程。
    若解决了你的疑问,望采纳,若还有疑问可以提出

    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况