欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java.util.concurrent JDK线程池 使用

程序员文章站 2022-04-03 12:36:00
...

使用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