Java并发编程——任务执行

1、在线程中执行任务

围绕执行任务来管理应用程序时,第一步指明一个清晰的任务边界

在正常的负载下,服务器应用程序应该兼具良好的吞吐量和快速的响应性。

在中等强度的负载水平下,“每任务每线程”方法是对顺序化执行的良好改进。只要请求的到达速度尚未超出服务器的请求处理能力,那么这种方法可以同时带来更快的响应性和更大的吞吐量。

无限创建线程缺点:线程生命周期的开销;资源消耗量;稳定性。

2、Executor框架(Executor、Executors、ExecuteService)

如果要在你的程序中实现一个生产者-消费者的设计,使用Executor通常是最简单的方式。

无论何时当你看到这种形式的代码:new Thread(runnable).start()并且你可能最终希望获得一个更加灵活的执行策略时,请认真考虑使用Executor代替Thread。

线程池优势:重用存在的线程,在处理多请求时抵消线程创建、消亡产生的开销;提高了响应性;适当调整线程池的大小,可以得到足够多的线程保持处理器忙碌,同时还可以防止过多线程相互竞争资源,导致应用程序耗尽内存或者失败。

ExecuteService接口扩展了Executor,并且添加了一些用于生命周期管理的方法。

延迟的并具周期性的任务ScheduleThreadPoolExecutor实现。

3、寻找可强化的并行性

大量相互独立且同类的任务进行并发处理,会将程序的任务量分配到不同的任务中,这样才能真正获得性能的提升。 

CompletionService整合了Executor和BlockingQueue的功能。你可以将Callable任务提交给它去执行,然后使用类似于队列中的take和poll方法,在结果完整可用时获得这个结果,像一个打包的Future。

为任务设置时限。 



留言