Java多线程之线程池使用

来源:互联网 发布:恒宝充电器淘宝店 编辑:程序博客网 时间:2024/05/16 18:58

本文介绍在Java中如何使用线程池。阅读本文内容,读者需要对多线程及线程池的知识有所了解,对Java线程池的创建及Executors, ExecutorService关键类有所接触。关于这些方面的知识,可以参阅作者的前篇文章。

 

关键类和方法

创建Java线程池所需要的两个基本类:Executors和ExcecutorService类。

Executors类

Executors是一个工厂类,提供了一系列工具方法创建ExecutorService或其子类。

ExecutorService类

ExecutorService线程池能够被关闭,这时它将拒绝新的任务请求。它有两个方法用于关闭线程池。它的shutdown方法允许已经提交的任务在终止前执行,而shutdownNow方法则会阻止等待的任务启动并且尝试停止正在执行的任务。一个不再使用的ExecutorService线程池应该被关闭以便重新分配它所占用的资源。

Submit方法

方法submit继承于方法execute方法,它能够创建并返回一个Future对象,用于取消执行和(或)等待完成。英文原文:Method submit extends base method Executor.execute(Runnable) bycreating and returning a Future that can be used to cancel execution and/orwait for completion.

 

使用范例

下面引用官方文档的使用范例。

下面一个网络服务的构架。线程池中的线程用于处理传入的请求。它使用预先设定的Executors.newFixedThreadPool 工厂方法:

 class NetworkService implements Runnable {   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 run() { // run the service     try {       // 创建一个循环处理不断到来的网络请求       for (;;) {         // accept为阻塞方法。每收到一个新的网络请求,则继续执行         // 对每个新的网络请求,将其加入线程池中等待执行         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 on socket   } }}

本示例来源于官方文档。感兴趣的小伙伴可以下载Oracle的JDK文档深入挖掘。


0 0