标签:schedule 核心 空闲 ack 任务队列 博文 inter work imu
java线程池
什么是线程池?
线程池就是一个容器,把创建的若干个线程放入这个容器中,当处理任务需要运行线程时,线程池会将线程提交到任务队列中,处理完之后线程并不会被销毁,而是仍然处于线程中,等待下一任务,如果之后还有任务要使用这个线程,该线程会再次被提交到任务队列中。
使用线程池的优点
线程池有哪些类型
1.newCachedThreadPool
一种可以缓存的线程池,若是线程池长度超过了处理需要,将会灵活回收空闲线程,若是没有课回收的线程,则会创建新的线程。该线程池容量为无限大,当执行第二个任务时,如果需要第一个已完成任务中执行过的线程,那么线程池可以重复调用,不需要重新创建新的线程。
实例代码如下:
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index = i;
try {
Thread.sleep(index * 1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(index);
}
});
}
2 newFixedThreadPool
一种固定大小的线程池,可以控制线程最大并发数,超出的线程会在队列中等待,定长线程池的大小可以根据系统资源进行设置。
示例代码:
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int index = i;
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字
3 newScheduledThreadPool
一种定长的线程池,支持定时或者周期性地执行线程。
延迟3秒执行的示例代码:
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("delay 3 seconds");
}
}, 3, TimeUnit.SECONDS);
表示定长为5,延迟3秒执行的线程池
延迟1秒后每3秒执行一次,周期性执行的示例代码:
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);
4 newSingleThreadExecutor
一种单线程化的线程池,它会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行。示例代码如下:
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
结果按照顺序输出
线程池中的参数
参考博文:https://www.jianshu.com/p/174958a72ce9
https://www.cnblogs.com/ConstXiong/p/11686245.html
标签:schedule 核心 空闲 ack 任务队列 博文 inter work imu
原文地址:https://www.cnblogs.com/TidalCoast1034/p/13622711.html