线程池

发表时间:2017-07-22 15:28:49 浏览量( 41 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度

学习过程:

Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。


ThreadPoolExecutor提供了另一个非常强有力的接口,那就是callable。这个接口和runnable类似,但是实现这个

接口的方法是call方法,这个方法是可以返回值的,弥补了runnable不能返回值的悲哀。而且这个方法可以配合ThreadP

oolExecutor使用,获得Future接口,从这个接口的名字我们就能知道,返回的这个类似于指向这个线程的一个指针,我

们能通过这个Future接口知道当前线程的运行情况,包括是否已经完成任务,目前运行情况,运行完成后的返回值等,

public class Task implements Callable {
	private String filename;

	public Task(String filename) {
		this.filename = filename;
	}

	public String call() throws Exception {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("完成 " + filename);
		return "返回值" + filename;
	}

}


调用线程

public class ThreadPoolExecutorTest {
	public void start() throws InterruptedException, ExecutionException {
	        /**
	         * 创建线程池,并发量最大为5
	         * LinkedBlockingDeque,表示执行任务或者放入队列
	         */
	        ThreadPoolExecutor tpe = new ThreadPoolExecutor(5, 10, 0,
	                TimeUnit.SECONDS, new LinkedBlockingDeque(),
	                new ThreadPoolExecutor.CallerRunsPolicy());

	        //存储线程的返回值
	        List<Future> results = new LinkedList<Future> ();
	        
	        for (int i = 0; i < 100; i++) {
	            Task task = new Task(String.valueOf(i));
	            System.out.println("放入线程池:" + i);
	            //调用submit可以获得线程的返回值
	            Future result = tpe.submit(task);
	            results.add(result);
	            
	        }

	        //此函数表示不再接收新任务,
	        //如果不调用,awaitTermination将一直阻塞        tpe.shutdown();
	        //1天,模拟永远等待
	       // System.out.println(tpe.awaitTermination(1, TimeUnit.DAYS));

	        //输出结果
	        for (int i = 0; i < 10; i++) {
	            System.out.println(results.get(i).get());
	        }
	        
	        //已完成的数量
	        System.out.println(tpe.getCompletedTaskCount());

	}

	public static void main(String[] args) throws InterruptedException, ExecutionException {
		ThreadPoolExecutorTest test = new ThreadPoolExecutorTest();
		test.start();
	}
}