Xri*_*ris 5 java multithreading
我在java中创建一个http代理服务器.我有一个名为Handler的类,它负责处理来自Web浏览器和Web服务器的请求和响应.我还有另一个名为Copy的类,它将inputStream对象复制到outputStream对象.这两个类都实现了Runnable接口.我想在我的设计中使用线程池的概念,但我不知道如何去做!任何提示或想法将受到高度赞赏.
use*_*300 10
我建议你看一下Executor和ExecutorService.他们添加了许多好东西,以便更容易使用线程池.
...
@Azad提供了一些很好的信息和链接.您还应该购买并阅读" Java Concurrency in Practice "一书.(通常缩写为JCiP)注意stackoverflow大假发 - 如何将一些收入链接到亚马逊?
下面是我对如何使用和利用带线程池的ExecutorService的简要总结.假设您想要池中的8个线程.
您可以使用ThreadPoolExecutor的全功能构造函数创建一个,例如
ExecutorService service = new ThreadPoolExecutor(8,8, more args here...);
Run Code Online (Sandbox Code Playgroud)
或者您可以使用更简单但可定制性较低的Executors工厂,例如
ExecutorService service = Executors.newFixedThreadPool(8);
Run Code Online (Sandbox Code Playgroud)
您立即获得的一个优势是能力shutdown()或shutdownNow()线程池,并通过isShutdown()或检查此状态isTerminated().
如果你不太关心你想要运行的Runnable,或者它们写得很好,自包含,永不失败或适当地记录任何错误等等......你可以打电话
execute(Runnable r);
Run Code Online (Sandbox Code Playgroud)
如果您关心结果(例如,它计算pi或从网页下载图像)和/或您关心是否存在异常,则应使用返回Future的提交方法之一.这允许您在将来的某个时间检查任务是否通过isDone()并检索结果get().如果有异常,get()则抛出它(包装在ExecutionException中).注意 - 即使你的Future没有"返回"任何东西(它是Void类型),调用get()(忽略void结果)来测试Exception 仍然是一个好习惯.
然而,这次检查未来有点鸡和蛋的问题.线程池的重点是不阻塞地提交任务.但是Future.get()阻塞了,Future.isDone()引出了哪个线程正在调用它的问题,以及如果它没有完成它会做什么 - 你睡觉()和阻塞吗?
如果您同时提交一组已知相关的任务,例如,您正在执行一些大数学计算,如可以并行完成的矩阵乘法,并且获得部分结果没有特别的优势,您可以调用invokeAll().然后调用线程将阻塞,直到所有任务完成,此时您可以调用Future.get()所有Futures.
如果任务更加脱节,或者您真的想要使用部分结果怎么办?使用ExecutorCompletionService,它包装ExecutorService.任务完成后,它们将被添加到队列中.这使得单个线程可以轻松地轮询和从队列中删除事件.JCiP有一个很好的网页应用程序示例,它可以并行下载所有图像,并在它们可用于响应时立即呈现它们.