执行器对象中使用自定义ThreadFactory

Java 9并发编程指南 目录

执行器对象中使用自定义ThreadFactory

  • 准备工作
  • 实现过程
  • 工作原理
  • 更多关注

在上一节中,我们介绍了工厂模式,并通过ThreadFactory接口,提供了如何实现线程工厂的范例。

Executor框架是一种将线程创建和执行分开的机制。它基于Executor和ExecutorService接口,以及实现这两个接口的ThreadPoolExecutor类。此框架包含一个内部线程池,并提供方法发送两种任务到池线程中执行它们,这两种任务如下所示:

  • 实现Runnable接口的类,实现不返回值的任务
  • 实现Callable接口的类,实现返回值的任务

Executor框架在内部使用ThreadFactory接口创建线程,用于生成新线程。本节将学习如何实现自定义线程类和线程工厂来创建此类的线程,以及如何在执行器中使用这个工厂来执行这些线程。

准备工作

本范例通过Eclipse开发工具实现。如果使用诸如NetBeans的开发工具,打开并创建一个新的Java项目。

实现过程

通过如下步骤实现范例:

  1. 复制MyThread、MyThreadFactory和MyTask类到工程中,它们在“”小节中实现,本范例中将使用到这些类。

  2. 通过创建名为Main的类,添加main()方法,实现本范例主类:

    public class Main {
    	public static void main(String[] args) throws Exception{
    
  3. 创建名为threadFactory的新的MyThreadFactory对象:

    		MyThreadFactory threadFactory=new MyThreadFactory("MyThreadFactory");
    
  4. 使用Executors类的newCachedThreadPool()方法创建新的Executor对象,将之前创建的工厂对象作为参数传递。新的Executor对象将使用这个工厂创建必要的线程,所以它将执行MyThread线程:

    		ExecutorService executor=Executors.newCachedThreadPool(threadFactory);
    
  5. 创建新的Task对象,使用submit()方法将此对象发送到执行器:

    		MyTask task=new MyTask();
    		executor.submit(task);
    
  6. 使用shutdown()方法关闭执行器:

    		executor.shutdown();
    
  7. 使用awaitTermination()方法等待执行器结束:

    		executor.awaitTermination(1, TimeUnit.DAYS);
    
  8. 输出指明程序终止的信息到控制台:

    		System.out.printf("Main: End of the program.\n");
    	}
    }
    

工作原理

在上节“工作原理”中,详细解释了MyThread、MyThreadFactory和MyTask类的工作原理。

本范例的main()方法中,使用Executors类的newCachedThreadPool()方法创建Executor对象,将之前创建的工厂对象作为参数传递,所以创建的Executor对象将使用此工厂创建它所需要的线程,并且还执行MyThread类的线程。

执行程序将看到关于线程启动时间和执行时间的信息,下图显示本范例在控制台输出的执行信息:

pics/08_03.jpg

更多关注

本章“实现为fork/join框架生成自定义线程的ThreadFactory接口”小节

你可能感兴趣的:(Java,多线程)