线程池的执行策略
判断核心线程池是否已满?不满,new一个线程执行任务;满了,执行步骤2
线程队列是否已满?不满,放在工作队列里;满了,new一个线程执行任务。
判断线程是否超过最大线程数?未超过,可以new线程执行任务;超过了,任务被拒绝,执行
RejectedExecutionHandler.rejectedExecution()方法
当一个线程完成任务,则从队列中取任务继续执行
如果线程不在工作,超过设定的超时时间(
keepAliveTime),如果线程大于corePoolSize,这个线程被停掉。
线程队列:
拒绝策略:
举例:
package test.java;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestThreadPool {
public static void main( String[] args ) {
ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(10);
ThreadPoolExecutor t = new ThreadPoolExecutor(2, 4, 1000, TimeUnit.MILLISECONDS, queue);
for (int i = 0; i < 10; i++) {
TestThreadPool a = new TestThreadPool();
TaskWorker task = a.new TaskWorker("task--" + i);
t.execute(task);
}
}
class TaskWorker implements Runnable {
private String name;
public TaskWorker(String name) {
this.name = name;
}
public void run() {
System.out.println(System.currentTimeMillis()+ " taskName: " + name);
}
}
}
创建java原生线程池的四种方式
//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new Test("1"));
//创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
ExecutorService executorService1 = Executors.newFixedThreadPool(2);
executorService1.execute(new Test("1"));
// 创建一个定长线程池,支持定时及周期性任务执行。
ExecutorService executorService2 = Executors.newScheduledThreadPool(2);
executorService2.execute(new Test("1"));
//创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务
//,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
ExecutorService executorService3 = Executors.newSingleThreadExecutor();
executorService3.execute(new Test("1"));
如果系统中存在大量使用线程池,则由必要对线程池进行监控,方便在出现问题时,可根据线程池使用情况进行快速定位。可根据线程池提供的参数进行监控,常用属性如下:
要想合理的配置线程池,先要对任务特性进行分析。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。