128-线程生产者消费者的综合实战结合Java8语法
数据采集功能:利用多个线程采集多台服务器运行状态信息。当服务器数量较少时,可以采取一个线程采集一台服务器;但是服务器数量非常大时,将不可能采取这种方式,可以开启一定数量的线程采集完成后再采集其他服务器,即运行的线程始终保持着稳定数量。
操作系统可以支持一个应用开启的线程数量是有限制的,取决于stack size。多线程的性能是有一个峰值的,超过峰值性能反而会下降。这是因为线程数量过大时,应用的上下文切换会消耗很大一部分资源。
public class CaptureService {
private static final LinkedList<Control> CONTROLS = new LinkedList<>();
private static final int MAX_WORKER = 5;
public static void main(String[] args) {
List<Thread> worker = new ArrayList<>();
Stream.of("M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10")
.map(CaptureService::createCaptureService)
.forEach(t -> {
t.start();
worker.add(t);
});
worker.forEach(t -> {
t.join();
});
Optional.of("All of capture work finished.").ifPresent(System.out::println);
}
public static Thread createCaptureService(String name) {
return new Thread(() -> {
Optional.of("The worker [" + Thread.currentThread().getName() + "] BEGIN capture data.").ifPresent(System.out::println);
synchronized (CONTROLS) {
while (CONTROLS.size() > MAX_WORKER) {
CONTROLS.wait();
}
CONTROLS.addLast(new Control());
}
Optional.of("The worker [" + Thread.currentThread().getName() + "] is WORKING...").ifPresent(System.out::println);
Thread.sleep(10_000);
synchronized (CONTROLS) {
Optional.of("The worker [" + Thread.currentThread().getName() + "] END capture data.").ifPresent(System.out::println);
CONTROLS.removeFirst();
CONTROLS.notifyAll();
}
}, name);
}
private static class Control {}
}
Optional可以防止NPE空指针异常
解决的问题:
- 多个线程上下文切换带来的损耗问题
- 多个线程占多个资源,比如同时创建多个数据库连接、打开多个文件(文件句柄是有限的)。
学习了线程池之后,可以不必这么麻烦啦。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com
文章标题:128-线程生产者消费者的综合实战结合Java8语法
文章字数:463
本文作者:神秘的小岛岛
发布时间:2019-12-01, 17:09:25
最后更新:2019-12-01, 18:20:32
原始链接:https://www.tuyrk.cn/wang-thread/128-prod-cons-case/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。