java中有四种线程池:
一,缓存线程池:
1,判断有无空闲的进程;
2,存在则使用线程;
3,不存在则重新新增线程放入线程池,线程池无限制大小,并使用该线程;
ExecutorService service = Executors.newCachedThreadPool();
//向线程池中 加入 新的任务
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());
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println("线程的名称:"+Thread.currentThread().getName());
}
});
结果:
线程的名称:pool-1-thread-3
线程的名称:pool-1-thread-2
线程的名称:pool-1-thread-1
二,定长线程池:
1,判断有无空闲的进程;
2,存在则使用线程;
3,不存在则新增线程放入线程池,并使用;
4,线程池已满,则等待线程池中的空闲线程;
//线程池预先设定限制2条线程
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());
}
});
结果:
线程的名称:pool-1-thread-2
线程的名称:pool-1-thread-1
三,单线程线程池:
1,判断有无空闲进程;
2,存在则使用;
3,不存在则等待该线程空闲再使用;
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());
}
});
结果:
线程的名称:pool-1-thread-1
线程的名称:pool-1-thread-1
四,周期性任务定长线程池:
与定长线程池类似,只是线程加了时间触发的条件,当线程触发条件才运行该线程;
间隔时间执行:
ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
service.schedule(new Runnable() {
@Override
public void run() {
System.out.println("---线程执行中---");
}
},1, TimeUnit.SECONDS);
一段时间后再间隔执行:
ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
service.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("---线程执行中---");
}
},2,1, TimeUnit.SECONDS);