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

线程池

时间:2023-04-02 01:19:06 Java

以上是任务提交后的线程池处理流程。如果想在任务提交前预热线程池,可以使用prestartAllCoreThreads提前创建线程。需要注意的是,上图中两个地方的创建线程都需要加锁。相关代码如下:privatebooleanaddWorker(RunnablefirstTask,booleancore){retry:for(;;){intc=ctl.得到();intrs=runStateOf(c);//仅在必要时检查队列是否为空。如果(rs>=SHUTDOWN&&!(rs==SHUTDOWN&&firstTask==null&&!workQueue.isEmpty()))返回false;对于(;;){intwc=workerCountOf(c);如果(wc>=CAPACITY||wc>=(core?corePoolSize:maximumPoolSize))返回false;如果(compareAndIncrementWorkerCount(c))中断重试;c=ctl.get();//重新读取ctlif(runStateOf(c)!=rs)continueretry;//否则CAS因workerCount更改而失败;重试内循环}}booleanworkerStarted=false;布尔workerAdded=false;工人w=null;try{//这里的内部类Worker继承了AbstractQueuedSynchronizer,也实现了Runnable//Worker中有一个Thread属性,每次创建一个任务都会对应创建一个线程w=newWorker(firstTask);最终线程t=w.thread;if(t!=null){finalReentrantLockmainLock=this.mainLock;//锁定mainLock.lock();try{//持有锁时重新检查。//退出ThreadFactory失败或如果//在获取锁之前关闭。intrs=runStateOf(ctl.get());if(rslargestPoolSize)largestPoolSize=s;添加的工人=真;}}最后{mainLock.unlock();}if(workerAdded){t.start();workerStarted=真;}}}finally{if(!workerStarted)addWorkerFailed(w);}返回workerStarted;对元素进行排序LinkedBlockingQueue:基于链表结构的阻塞队列,也是按照FIFO原则排序的,吞吐量通常高于ArrayBlockingQueue。SynchronousQueue:阻塞队列,本身不存储元素。每次插入都要等到另一个线程调用移除操作,否则插入操作会一直阻塞,吞吐量高于LinkedBlockingQueue。PriorityBlockingQueue:具有优先级的无限阻塞队列。几种饱和策略:AbortPolicy:直接抛出异常(默认)CallerRunsPolicy:使用调用者所在线程运行DiscardPolicy:丢弃队列中最新的任务,执行当前任务dISCARDPolicy:不处理,丢弃定义处理的策略.