什么是线程池
顾名思义,就是把多个线程创建好放在池子里,要想用哪个直接拿就行了,
线程池是一种多线程处理方式,将多个任务放在队列中,创建线程之后自动启动这些任务,需要注意的是,这里的线程必须由实现了Runnable接口和Callable接口的线程对象
为什么需要线程池
如果并发的线程数量很多,并且每个线程都是执行一段时间就结束了,这种要创建多次的线程的效率会大大降低系统的效率,因为创建和销毁都需要时间
怎么创建线程池
1:创建缓存线程池
package com.threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author 邓亚非
*/
public class TestThreadPool {
public static void main(String[] args) {
// 创建一个缓存的线程池
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i <10 ; i++) {
int temp=i;
// 通过execute方法,传递线程任务
executorService.execute(new Runnable() {
@Override
public void run() {
// 输出每一个线程的任务
System.out.println(Thread.currentThread().getName()+",i:"+temp);
}
});
}
}
}
2:创建固定长度的线程池
package com.threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author 邓亚非
*/
public class ThreadPool01 {
public static void main(String[] args) {
// 创建规定长度的线程池
// 此方式创建线程池即使任务比线程多,但是还是这几个线程去完成任务
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i <10 ; i++) {
int temp=i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"i:"+temp);
}
});
}
}
}
3:创建一个固定定时的线程池
package com.threadpool;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @author 邓亚非
*/
public class TestThreadPool02 {
public static void main(String[] args) {
// 创建一个规定长度的任务线程池
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
for (int i = 0; i <10 ; i++) {
int temp=i;
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+",i:"+temp);
}
},2, TimeUnit.SECONDS);
}
}
}
4:创建一个采用Executors类下的newSingleThreadExecutor()构建一个固定长度的线程池
package com.threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author 邓亚非
*/
public class TestThreadPool04 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i <10 ; i++) {
int temp=i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+",i:"+temp);
}
});
}
}
}