天天看点

定制并发类(五)在一个Executor对象中使用我们的ThreadFactory

在一个executor对象中使用我们的threadfactory

在前面的指南中,实现threadfactory接口生成自定义线程,我们引进了工厂模式和提供如何实现一个实现threadfactory接口的线程的工厂例子。

执行者框架(executor framework)是一种机制,它允许你将线程的创建与执行分离。它是基于executor、executorservice接口和实现这两个接口的threadpoolexecutor类。它有一个内部的线程池和提供一些方法,这些方法允许你提交两种任务给线程池执行。这两种任务是:

实现runnable接口的类,用来实现没有返回结果的任务

实现callable接口的类,用来实现有返回结果的任务

在执行者框架(executor framework)的内部,它提供一个threadfactory接口来创建线程,这是用来产生新的线程。在这个指南中,你将学习如何实现你自己的线程类,用一个工厂来创建这个类的线程,及如何在执行者中使用这个工厂,所以这个执行者将执行你的线程。

准备工作…

阅读之前的指南,实现threadfactory接口生成自定义线程,并实现它的例子。

这个指南的例子使用eclipse ide实现。如果你使用eclipse或其他ide,如netbeans,打开它并创建一个新的java项目。

如何做…

按以下步骤来实现的这个例子:

1.将实现threadfactory接口生成自定义线程的指南中实现的mythread、mythreadfactory和mytask类复制到这个项目中,所以你将在这个例子中继续使用它们。

2.实现这个例子的主类,通过创建main类,并实现mian()方法。

<code>1</code>

<code>public</code> <code>class</code> <code>main {</code>

<code>2</code>

<code>public</code> <code>static</code> <code>void</code> <code>main(string[] args)</code><code>throws</code> <code>exception {</code>

3.创建一个新的mythreadfactory对象,名为threadfactory。

<code>mythreadfactory threadfactory=</code><code>new</code> <code>mythreadfactory(</code><code>"mythreadfactory"</code><code>);</code>

4.使用executors类的newcachedthreadpool()方法,创建一个新的executor对象。传入前面创建的工厂对象作为参数。这个新的executor对象将使用这个工厂创建必需的线程,所以它将执行mythread线程。

<code>executorservice executor=executors.newcachedthreadpool(threadfactory);</code>

5.创建一个新的task对象,并使用submit()方法将它提交给执行者。

<code>mytask task=</code><code>new</code> <code>mytask();</code>

<code>executor.submit(task);</code>

6.使用shutdown()方法关闭这个执行者。

<code>executor.shutdown();</code>

7.使用awaittermination()方法,等待执行者的结束。

<code>executor.awaittermination(</code><code>1</code><code>, timeunit.days);</code>

8.写入一条信息表明程序的结束。

<code>system.out.printf(</code><code>"main: end of the program.\n"</code><code>);</code>

它是如何工作的…

在前面指南(实现threadfactory接口生成自定义线程)中的它是如何工作的部分中,你可以阅读到关于mythread、mythreadfactory和mytask工作的详细解释。

在这个例子的main()方法中,你已使用executors类的newcachedthreadpool()方法创建一个executor对象。你已传入之前创建的工厂对象作为参数,所以已创建的executor对象将使用这个工厂来创建它所需的线程,并且它将执行mythread类的线程。

执行这个程序,你将看到关于线程的开始日期和它的执行时间的信息。以下截图显示了这个例子产生的输出:

定制并发类(五)在一个Executor对象中使用我们的ThreadFactory

参见

在第7章,定制并发类中的实现threadfactory接口生成自定义线程指南

继续阅读