博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程池
阅读量:5134 次
发布时间:2019-06-13

本文共 2695 字,大约阅读时间需要 8 分钟。

java.util.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类;

在ThreadPoolExecutor类中提供了四个构造方法:

public class ThreadPoolExecutor extends AbstractExecutorService {

    
.....
    
public 
ThreadPoolExecutor(
int 
corePoolSize,
int 
maximumPoolSize,
long 
keepAliveTime,TimeUnit unit,
            
BlockingQueue<Runnable> workQueue);
 
    
public 
ThreadPoolExecutor(
int 
corePoolSize,
int 
maximumPoolSize,
long 
keepAliveTime,TimeUnit unit,
            
BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);
 
    
public 
ThreadPoolExecutor(
int 
corePoolSize,
int 
maximumPoolSize,
long 
keepAliveTime,TimeUnit unit,
            
BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler);
 
    
public 
ThreadPoolExecutor(
int 
corePoolSize,
int 
maximumPoolSize,
long 
keepAliveTime,TimeUnit unit,
        
BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
    
...
}
在ThreadPoolExecutor类中有几个非常重要的方法:

execute()方法实际上是Executor中声明的方法,在ThreadPoolExecutor进行了具体的实现,这个方法是ThreadPoolExecutor的核心方法,通过这个方法可以向线程池提交一个任务,交由线程池去执行。

submit()方法是在ExecutorService中声明的方法,在AbstractExecutorService就已经有了具体的实现,在ThreadPoolExecutor中并没有对其进行重写,这个方法也是用来向线程池提交任务的,但是它和execute()方法不同,它能够返回任务执行的结果,去看submit()方法的实现,会发现它实际上还是调用的execute()方法,只不过它利用了Future来获取任务执行结果。

shutdown()和shutdownNow()是用来关闭线程池的。

 

从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果;

Callable位于java.util.concurrent包下,它也是一个接口,在它里面只声明了一个方法,这个方法叫做call():

public interface Callable<V> {

    
/**
     
* Computes a result, or throws an exception if unable to do so.
     
*
     
* @return computed result
     
* @throws Exception if unable to compute a result
     
*/
    
V call() 
throws 
Exception;
}
可以看到,这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。
Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。

Future类位于java.util.concurrent包下,它是一个接口:

public interface Future<V> {

    
boolean 
cancel(
boolean 
mayInterruptIfRunning);
    
boolean 
isCancelled();
    
boolean 
isDone();
    
V get() 
throws 
InterruptedException, ExecutionException;
    
V get(
long 
timeout, TimeUnit unit)
        
throws 
InterruptedException, ExecutionException, TimeoutException;
}

在Future接口中声明了5个方法,下面依次解释每个方法的作用:

  • cancel方法用来取消任务,如果取消任务成功则返回true,如果取消任务失败则返回false。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置true,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为true还是false,此方法肯定返回false,即如果取消已经完成的任务会返回false;如果任务正在执行,若mayInterruptIfRunning设置为true,则返回true,若mayInterruptIfRunning设置为false,则返回false;如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,肯定返回true。
  • isCancelled方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。
  • isDone方法表示任务是否已经完成,若任务完成,则返回true;
  • get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;
  • get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。

  也就是说Future提供了三种功能:

  1)判断任务是否完成;

  2)能够中断任务;

  3)能够获取任务执行结果。

转载于:https://www.cnblogs.com/yzf666/p/6296855.html

你可能感兴趣的文章
Eclipse Python插件 PyDev
查看>>
selenium+python3模拟键盘实现粘贴、复制
查看>>
第一篇博客
查看>>
typeof与instanceof的区别
查看>>
网站搭建(一)
查看>>
SDWebImage源码解读之SDWebImageDownloaderOperation
查看>>
elastaticsearch
查看>>
postgreSQL 简单命令操作
查看>>
Spring JDBCTemplate
查看>>
Radon变换——MATLAB
查看>>
第五章笔记
查看>>
Iroha and a Grid AtCoder - 1974(思维水题)
查看>>
gzip
查看>>
转负二进制(个人模版)
查看>>
LintCode-Backpack
查看>>
查询数据库锁
查看>>
[LeetCode] Palindrome Number
查看>>
我对于脚本程序的理解——百度轻应用有感
查看>>
SQL更新某列包含XX的所有值
查看>>
网易味央第二座猪场落户江西 面积超过3300亩
查看>>