首页 > 编程语言 > 详细

java.util.concurrent JDK线程池 使用

时间:2015-11-21 02:05:26      阅读:315      评论:0      收藏:0      [点我收藏+]

使用JDK的线程池心得

这里使用的是 java.util.concurrent 包中的线程池。该包中所有方法都是线程安全的。

Executors.newCachedThreadPool();

????? API:创建一个可根据需要创建新线程的线程池。 如果想自己设置线程池的参数可以使用使用 :
ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,? long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable>workQueue)
?? 参数:
??? corePoolSize - 池中所保存的线程数,包括空闲线程。
??? maximumPoolSize - 池中允许的最大线程数。
??? keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
??? unit - keepAliveTime 参数的时间单位。
??? workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的???? Runnable 任务

目标方法:?

????? 需要实现Callable接口

public class TestCollable implements Callable<String>{
	private String result ;
	public TestCollable(String result){
		this.result = result;
	}
	@Override
	public String call() throws Exception {
		System.out.println("开始执行任务----"+Thread.currentThread().getName());
		System.out.println("任务: "+result);
		System.out.println("结束任务----"+Thread.currentThread().getName());
		return "bb";
	}
}

?

使用线程池 多线程调用目标方法

@Test 
public void testCall() throws InterruptedException, ExecutionException{
  	//newCachedThreadPool() 创建一个可根据需要创建新线程的线程池
  ExecutorService executorService = Executors.newCachedThreadPool();
	//调用get()方法程序将会阻塞 直到目标方法有返回值或者抛异常
    for(int i=0 ; i<5 ;i++){
           System.out.println(executorService.submit(new TestCollable("aa")).get());
     }
  }  
 }

?执行结果:

开始任务----pool-1-thread-1
任务: aa
任务结束----pool-1-thread-1
bb
开始任务----pool-1-thread-2
任务: aa
任务结束----pool-1-thread-2
bb

??

由此可以看出 executorService.submit(new TestCollable("aa")).get()); 方法阻塞了程序 直到有结果返回

?

?

将执行结果放入list观察 统一输出结果 不再阻塞程序

@Test
	public void testCall() throws InterruptedException, ExecutionException{
		ExecutorService executorService = Executors.newCachedThreadPool();
		ArrayList<Future<String>> results  = new ArrayList<Future<String>>();
		for(int i=0 ; i<5 ;i++){
			results.add(executorService.submit(new TestCollable("aa")));
		}
		for(Future<String> fs:results){
			System.out.println(fs.get());
		}
	}

?

程序执行结果

开始任务----pool-1-thread-1
开始任务----pool-1-thread-2
任务: aa
任务结束----pool-1-thread-2
任务: aa
任务结束----pool-1-thread-1
bb
bb
开始任务----pool-1-thread-3
任务: aa
任务结束----pool-1-thread-3
bb
开始任务----pool-1-thread-4
任务: aa
任务结束----pool-1-thread-4
bb
开始任务----pool-1-thread-5
任务: aa
任务结束----pool-1-thread-5
bb

?

?

java.util.concurrent JDK线程池 使用

原文:http://csf00298.iteye.com/blog/2258116

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!