如何在Java中使用线程池概念?

时间:2012-01-07 05:04:03

标签: java multithreading

我正在java中创建一个http代理服务器。我有一个名为 Handler 的类,它负责处理来自Web浏览器和Web服务器的请求和响应。我还有另一个名为 Copy 的类,它将inputStream对象复制到outputStream对象。这两个类都实现了 Runnable 接口。我想在我的设计中使用线程池的概念,但我不知道如何去做!任何提示或想法都将受到高度赞赏。

2 个答案:

答案 0 :(得分:10)

我建议您查看Executor和ExecutorService。他们添加了许多好东西,以便更容易使用线程池。

...

@Azad提供了一些很好的信息和链接。您还应该购买并阅读 Java Concurrency in Practice 一书。 (通常缩写为JCiP)注意stackoverflow大假发 - 如何将一些收入链接到亚马逊???

以下是我如何使用和利用带线程池的ExecutorService的简短摘要。假设您想要池中的8个线程。

您可以使用ThreadPoolExecutor的全功能构造函数创建一个,例如

ExecutorService service = new ThreadPoolExecutor(8,8, more args here...);

或者您可以使用更简单但可自定义较少的Executors工厂,例如

ExecutorService service = Executors.newFixedThreadPool(8);

您立即获得的一个好处是能够shutdown()shutdownNow()线程池,并通过isShutdown()isTerminated()检查此状态。

如果你不太关心你想要运行的Runnable,或者它们写得很好,自包含,永不失败或适当地记录任何错误等等......你可以打电话

execute(Runnable r);

如果您关心结果(例如,它计算pi或从网页下载图像)和/或您关心是否存在异常,则应使用返回Future的提交方法之一。这允许您在将来的某个时间检查任务isDone()是否通过get()检索结果。如果存在异常,get()将抛出它(包含在ExecutionException中)。注意 - 即使你的Future没有“返回”任何东西(它是Void类型),调用get()(忽略无效结果)来测试异常仍然是一个好习惯。

然而,这次检查未来有点鸡和蛋的问题。线程池的重点是不阻塞地提交任务。但是Future.get()阻塞了,Future.isDone()引出了哪个线程调用它的问题,以及如果没有完成它会做什么 - 你睡觉()和阻塞吗?

如果您同时提交已知的任务相关的块,例如,您正在执行一些大数学计算,例如可以并行完成的矩阵乘法,并且没有特别的优势获得部分结果,您可以致电invokeAll()。调用线程将阻塞,直到所有任务完成,此时您可以在所有期货上调用Future.get()

如果任务更加脱节,或者您真的想要使用部分结果,该怎么办?使用ExecutorCompletionService,它包装ExecutorService。任务完成后,它们将被添加到队列中。这使得单个线程可以轻松地轮询和从队列中删除事件。 JCiP有一个很好的网页应用程序示例,它可以并行下载所有图像,并在它们可用于响应时立即呈现它们。

答案 1 :(得分:4)

我希望下面能帮到你:,

班级执行人员
执行提交的object任务的Runnable。此接口提供了一种将任务提交与每个任务的运行机制分离的方法,包括线程使用,调度等的详细信息。通常使用Executor而不是显式创建{{1} }。例如,您可以使用:

,而不是为每组任务调用threads
new Thread(new(RunnableTask())).start()


class ScheduledThreadPoolExecutor
一个Executor executor = anExecutor; executor.execute(new RunnableTask1()); executor.execute(new RunnableTask2()); ... ,可以另外安排命令在给定的延迟后运行,或者定期执行。当需要多个工作线程时,或者需要ThreadPoolExecutor(此类扩展)的额外灵活性或功能时,此类优于Timer。

延迟任务在启用后立即执行,但没有任何实时保证,启用它们后何时启动它们。在ThreadPoolExecutor提交顺序中启用计划完全相同执行时间的任务。


Interface ExecutorService
first-in-first-out (FIFO)提供管理终止的方法和可以生成Future以跟踪一个或多个异步任务进度的方法

可以关闭Executor,这将导致它停止接受新任务。关闭后,执行程序最终将终止,此时没有任务正在执行,没有任务正在等待执行,也没有任何新任务可以提交。

已编辑:
您可以找到使用ExecutorServiceExecutorhere
here
here
{的示例{3}}