Loading

Java并发学习之Executor框架

一.我们为什么需要Executor框架?

在上一篇博客中我们可以了解到,任务是一组逻辑工作单元,而线程则是使任务异步执行的机制,而且我们学习了两种通过线程来执行任务的策略:1.把所有任务放在单个线程中串行执行2.将每个任务放到各自的线程中执行

但是上面的两种策略都存在严格的限制:
串行执行的问题在于其糟糕的响应性和吞吐量。
为每个任务创建线程的问题则在于资源管理的复杂性。

那么我们有没有方法能较好的解决上面的问题呢?
有,就是我们的Executor框架,它极大的简化了线程的管理工作,Java库中的java.util.concurrent提供了一种灵活的线程池实现作为Executor框架的一部分。

二.具体学习Executor

一般在Java类库中,执行任务的抽象不是Thread,而是Executor,Executor是个非常简单的接口:

public interface Executor{
   
    void execute(Runnable command);
}

这个接口虽然简单,但它为灵活且强大的异步任务执行框架提供了良好的基础。

Executor框架不仅提供了多种不同类型的执行任务策略,而且还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。它的功能远远比Thread强大。

1.Executor基于生产者-消费者模式实现
在Executor中,提交任务的操作相当于生产者,执行任务的操作相当于消费者,所以如果要在程序中实现一个生产者-消费者的设计,那么最简单的方式通常就是使用Executor。

代码实例:基于Executor的web服务器

class TaskExecutionWebServer{
   
   private static final int NTHREADS = 100;
   //创建一个大小为100的线程池
   private static final Executor exec = Executors.newFixedThreadPool(NTHREADS);
   
   public static void main(String [] args) throws IOException{
   
     ServerSocket socket = new ServerSocket(
posted @ 2020-11-17 13:18  文牧之  阅读(16)  评论(0)    收藏  举报  来源