Java通过Executors提供四种线程池,分别为:
1, newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
2, newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3, newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
4, newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
1,newCachedThreadPool
package com.tjoven.mExecutors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorsDemo {
ExecutorService executorService=null;
public static void main(String[] args) {
ExecutorsDemo demo=new ExecutorsDemo();
demo.exe();
}
void exe(){
executorService=Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
executorService.execute(new MyThread(i));
}
}
}
class MyThread implements Runnable{
int i=0;public MyThread(int i) {
this.i=i;
}
@Override
public void run() {
System.out.println(i+"@@@"+Thread.currentThread().getName());
}
}
运行结果如下:
开启了5个线程。如果把exe进行如下改动,让线程睡眠10ms
void exe(){
executorService=Executors.newCachedThreadPool() ;
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated
catch blocke.printStackTrace();
}
executorService.execute(new MyThread(i));
}
}
运行结果如下:
当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
2, newFixedThreadPool
void exe(){
executorService=Executors.newFixedThreadPool(2);
for (int i = 0; i < 5; i++) {
executorService.execute(new MyThread(i));
}
}
}
class MyThread implements Runnable{
int i=0;
public MyThread(int i) {
this.i=i;
}
@Override
public void run() {
System.out.println(i+"@@@"+Thread.currentThread().getName());
try {
<em><strong>Thread.sleep(2000)</strong>;</em>
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
因为线程池大小为2,每个任务输出sleep1秒,所以每隔一秒打印2个数字。在同一个线程池中,
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()
3,newScheduledThreadPool
public class ExecutorsDemo {
public static void main(String[] args) {
ExecutorsDemo demo=new ExecutorsDemo();
demo.exe();
}
void exe(){
ScheduledExecutorService executorService=Executors.newScheduledThreadPool(2);
for (int i = 0; i <5; i++) {
executorService.schedule(new MyThread(i), 1, TimeUnit.SECONDS);
}
}
}
class MyThread implements Runnable{
int i=0;
public MyThread(int i) {
this.i=i;
}
@Override
public void run() {
System.out.println(i+"@@@"+Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
线程池定长为2,延迟1s钟执行,每隔3s输出两个线程结果
void exe(){
ScheduledExecutorService executorService=Executors.newScheduledThreadPool(2);
executorService.scheduleAtFixedRate(new MyThread(), 1, 1, TimeUnit.SECONDS);
}
}
class MyThread implements Runnable{
int i=0;
public MyThread(int i) {
this.i=i;
}
public MyThread() {
// TODO Auto-generated constructor stub
}
@Override
public void run() {
System.out.println(i+"@@@"+Thread.currentThread().getName());
}
运行结果:
延迟1s执行,1s循环周期1s,
4,
void exe(){
ExecutorService executorService=Executors.newSingleThreadExecutor();
for (int i = 0; i < 5; i++) {
executorService.execute(new MyThread(i));
}
}
}
class MyThread implements Runnable{
int i=0;
public MyThread(int i) {
this.i=i;
}
public MyThread() {
// TODO Auto-generated constructor stub
}
@Override
public void run() {
System.out.println(i+"@@@"+Thread.currentThread().getName());
}
}
运行结果:
结果依次输出,相当于顺序执行各个任务。