线程池是一种多线程处理形式,在处理过程中将任务添加到队列中,然后在创建线程后自动启动这些任务。线程池在各种程序开发中的应用越来越频繁。本文分享四个种常见线程池。
线程池线程为后台线程。每个线程都使用默认的堆栈尺寸,以默认的优先级运行,并在多线程单元中。如果一个线程在托管代码中是免费的(如等待事件),线程池将插入另一个辅助线程,以保持所有处理器的忙碌。如果所有线程池的线程都很忙,但列中包含悬挂的工作,线程池将在一段时间后创建另一个辅助线程,但线程的数量永远不会超过最大值。超过最大值的线程可以排队,但他们必须等到其他线程完成后才能启动。以下是几个常见的线程池。
一、缓存线程池
/**
* 缓存线程池.
* (长度无限)
* 执行流程:
* 1. 判断线程池是否有空闲线程
* 2. 存在则使用
* 3. 如果不存在,则创建线程 并放入线程池, 然后使用
*/
ExecutorService service = Executors.newCachedThreadPool();
///在向线程池中 加入 新的任务
service.execute(new Runnable() {
@Override
public void run() {
System.out.println("线程名称:"+Thread.currentThread().getName());
*/
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Runnable() {
@Override
public void run() {
System.out.println("线程名称:"+Thread.currentThread().getName());
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println("线程名称:"+Thread.currentThread().getName());
}
});
三、单线程线程池
长线程池的效果和固定 在创建过程中输入数值1 效果一致.
/**
* 单线程线程池.
* 执行流程:
* 1. 判断线程池 的那个线程 是否空闲
* 2. 空闲则使用
* 4. 如果你没有空闲,等待 空闲后,池中的单线程 使用
*/
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(new Runnable() {
@Override
public void run() {
System.out.println("线程名称:"+Thread.currentThread().getName());
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println("线程名称:"+Thread.currentThread().getName());
}
});
四、周期性任务定长线程池
public static void main(String[] args) {
/**
* 周期任务 定长线程池.
* 执行流程:
* 1. 判断线程池是否有空闲线程
* 2. 存在则使用
* 3. 如果没有空闲线程,且线程池未满,则创建线程 并放入线程池, 然后使用
* 4. 如果没有空闲线程,线程池已满,则等待线程池有空闲线程
*
* 执行周期性任务时:
* 定时执行, 当某个时机触发时, 任务的自动执行 .
*/
ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
/**
* 定时执行
* 参数1. Runnnable类型的任务
* 参数2. 时长数字
* 参数3. 长数字单位
*/
/*service.schedule(new Runnable() {
@Override
public void run() {
System.out.println("两人相视一笑~ 嘿嘿嘿");
}
},5,TimeUnit.SECONDS);
*/
/**
* 周期执行
* 参数1. Runnnable类型的任务
* 参数2. 时长数字(延迟执行时长)
* 参数3. 周期时长(每次执行的间隔时间)
* 参数4. 长数字单位
*/
service.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("两人相视一笑~ 嘿嘿嘿");
}
},5,2,TimeUnit.SECONDS);
}
如果你能完全掌握上述四个我相信种线程池足以解决日常生活中遇到的线程池问题。当然,如果你不断改进,你可以观看本网站的追求多线程专题课程,为您答疑解惑。