A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

项目在进行多线程操作的时候,时常会碰到在一个主线程下要调用多个子线程的问题,如果调度保证这些线程不会打架很让人伤神,在JDK API中发现了这么个专门用来管理线程的接口,java.util.concurrent.ExecutorService。

以下是api的描述
public interface ExecutorServiceextends Executor
Executor 提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。

可以关闭 ExecutorService,这将导致其停止接受新任务。关闭后,执行程序将最后终止,这时没有任务在执行,也没有任务在等待执行,并且无法提交新任务。

通过创建并返回一个可用于取消执行和/或等待完成的 Future,方法 submit 扩展了基本方法 Executor.execute(java.lang.Runnable)。方法 invokeAny 和 invokeAll 是批量执行的最常用形式,它们执行任务集合,然后等待至少一个,或全部任务完成(可使用 ExecutorCompletionService 类来编写这些方法的自定义变体)。

Executors 类提供了用于此包中所提供的执行程序服务的工厂方法。

用法示例
下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的 Executors.newFixedThreadPool(int) 工厂方法:
Java代码  收藏代码
class NetworkService {  
    private final ServerSocket serverSocket;  
    private final ExecutorService pool;  
  
    public NetworkService(int port, int poolSize) throws IOException {  
      serverSocket = new ServerSocket(port);  
      pool = Executors.newFixedThreadPool(poolSize);  
    }  
   
    public void serve() {  
      try {  
        for (;;) {  
          pool.execute(new Handler(serverSocket.accept()));  
        }  
      } catch (IOException ex) {  
        pool.shutdown();  
      }  
    }  
  }  
  
  class Handler implements Runnable {  
    private final Socket socket;  
    Handler(Socket socket) { this.socket = socket; }  
    public void run() {  
      // read and service request  
    }  
}  

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马