当前位置: 首页 > 后端技术 > Java

记得一个源码探索——线程池提交任务时有多少个线程在运行

时间:2023-04-01 20:32:24 Java

这次主要有一个这样的疑问finalvoidrunWorker(Workerw){Threadwt=Thread.currentThread();可运行任务=w.firstTask;w.firstTask=null;w.解锁();//允许中断booleancompletedAbruptly=true;try{while(task!=null||(task=getTask())!=null){w.lock();//如果池正在停止,确保线程被中断;//如果不是,确保线程没有被中断。这//在第二种情况下需要重新检查以处理//shutdownNow竞争,同时清除中断if((runStateAtLeast(ctl.get(),STOP)||(Thread.interrupted()&&runStateAtLeast(ctl.get(),STOP)))&&!wt.isInterrupted())wt.interrupt();尝试{beforeExecute(wt,task);Throwable抛出=null;尝试{task.run();}赶上(RuntimeExce选项x){抛出=x;扔x;}赶上(错误x){抛出=x;扔x;}catch(Throwablex){抛出=x;抛出新错误(x);}最后{afterExecute(任务,抛出);}}最后{task=null;w.completedTasks++;w.解锁();}}completedAbruptly=false;}finally{processWorkerExit(w,completedAbruptly);并不是线程池提交任务后,任务自己又启动了一个线程,所以用代码来验证publicclassThreadPool{privatestaticExecutorServicepool;publicstaticvoidmain(String[]args){//maximumPoolSize设置为2,拒绝策略对于AbortPolic策略,直接抛出异常pool=newThreadPoolExecutor(2,10,1000,TimeUnit.MILLISECONDS,newSynchronousQueue(),Executors.defaultThreadFactory(),newThreadPoolExecutor.AbortPolicy());for(inti=0;i<3;i++){pool.execute(newThreadTask());}}publicstaticclassThreadTaskimplementsRunnable{publicThreadTask(){}publicvoidrun(){System.out.println(Thread.currentThread().getName());然后我发现如下图一共有3个线程,一个是主线程,一个是worker中不停取任务的线程。这是coresize指示的线程,一个是真正的任务线程