线程池

为什么要创建线程池?怎么创建线程池?

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任务

posted @ 2019-11-13 11:01  cow09  阅读(129)  评论(0)    收藏  举报