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

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

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

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

下面是我对如何使用ExecutorService和利用线程池的简要总结。 假设您想要池中的8个线程。

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

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

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

 ExecutorService service = Executors.newFixedThreadPool(8); 

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

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

 execute(Runnable r); 

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

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

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

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

我希望下面会帮助你:

类执行者
执行提交的Runnable任务的object 。 此接口提供了一种将任务提交与每个任务的运行机制分离的方法,包括线程使用,调度等详细信息。通常使用Executor而不是显式创建threads 。 例如,不是为一组任务调用new Thread(new(RunnableTask())).start() ,而是使用:

 Executor executor = anExecutor; executor.execute(new RunnableTask1()); executor.execute(new RunnableTask2()); ... 

class ScheduledThreadPoolExecutor
ThreadPoolExecutor ,可以额外调度命令在给定延迟后运行,或定期执行 。 当需要多个工作线程时,或者当需要ThreadPoolExecutor (此类扩展)的额外灵活性或function时,此类优于Timer。

延迟任务在启用后立即执行,但没有任何实时保证,启用它们后何时启动它们。 按照first-in-first-out (FIFO)提交顺序启用计划完全相同执行时间的任务。


接口ExecutorService
一个Executor ,提供管理终止的方法和可以生成Future的方法,用于跟踪一个或多个异步任务的进度

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

编辑:
您可以找到使用ExecutorExecutorService示例
这里
这里
在这里
问题对你有用。