线程池
为什么要创建线程池?怎么创建线程池?
1、首先我们知道线程创建的三种方式
(1)继承Thread类并重写run()方法
(2)实现Runnable接口(无返回值)
(3)实现Callable接口(有返回值)
线程的建立到销毁就是它的使用期,有时候需要频繁的建立一些新的线程去实现一些功能,而在作用期结束后又必须销毁,这就造成了极大的资源浪费,所以如果线程发挥完它作用期后,不销毁,而只是放到线程池中,等到有需要的时候再拿出来,就不用再创新的线程,那么就极大节省空间和时间。
2、线程池的创建五种方式
(1)newSigleThreadExecutor
创建单一线程化的Executor,所有任务都是被顺序执行的。
ExecutorService service =Executors.newSingleThreadExecutor();
(2)newFiexedThreadPool
创建一个可以指定线程数量的线程池。
构造函数:
ExecutorService service =Executors.newFixedThreadPool(nThreads) //n:即可建立的线程数
(3)newCacheThreadPool
创建一个可以缓存的线程池,
ExecutorService service =Executors.newCachedThreadPool();
(4)newscheduledThreadPool
创建一个支持定时及周期性执行的线程池
ScheduledExecutorService service =Executors.newScheduledThreadPool(corePoolSize); //corePoolSize:核心池的大小,如果该位置有空闲位置,核心池中建线程执行新的任务,执行完不会被销毁,放入缓冲池中。
(5)ThreadPoolExecutor
ExecutorService service = new ThreadPoolExecutor(10, 10, 60L, TimeUnit.SECONDS,new ArrayBlockingQueue<>(10));
最原始的创建
构造函数:
maximunPoolSize:线程池能创建最大的线程数量。
keepAliveTime:非核心线程能够空闲的最长时间,超过时间,线程终止。
workQueue:缓存队列,用来存放等待被执行的任务。
threadFactory:线程工厂,用来创建线程,一般有三种选择策略。
ArrayBlockingQueue; LinkedBlockingQueue; SynchronousQueue;
3、例子
package test;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolDemo {
public static void main (String []args){
ExecutorService service = new ThreadPoolExecutor(10, 10, 60L, TimeUnit.SECONDS,new ArrayBlockingQueue<>(10));
for(int i= 0;i<5;i++){
Task task = new Task();
service.execute(task);
}
List<Runnable> list = service.shutdownNow();
System.out.println(list.size());
}
}
public class Task implements Runnable{
int count;
public void run(){
String name = Thread.currentThread().getName();
System.out.println(name+"开始执行任务");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name+"任务结束");
}
}
4、线程池的几种状态
(1)Running
正常的运行状态,接受新的任务,处理正在等待列队中的任务。
(2)Shutdown
不接收新的任务,但是会处理等待队列中的任务。
(3)Stop
停止接收新的任务,不处理等待队列中的任务,中断正在执行的线程。
(4)Tidying
所有的线程销毁,当线程池状态转化成tidying时会执行钩子方法terminated()。
(5)terminated
执行完terminated方法后就转化成这个状态。
5、线程池中Execute()和submin这两个方法的区别
submin执行Runnable和Callable的任务
而Execute只执行Runnable任务

浙公网安备 33010602011771号