Repository navigation
Expand file tree
/
Copy pathCaptureService.java
More file actions
76 lines (64 loc) · 2.22 KB
/
Copy pathCaptureService.java
File metadata and controls
76 lines (64 loc) · 2.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package com.concurrent.thread.communicate;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Stream;
/**
* 模拟限制线程数量去处理抓取业务
*/
public class CaptureService {
//控制线程数量容器,Control无特殊含义
private static final LinkedList<Control> CONTROLS = new LinkedList<>();
private static final int MAX_CONTROL = 5;
public static void main(String[] args) {
List<Thread> worker = new ArrayList<>();
//启动10个线程
Stream.of("M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M0")
.map(CaptureService::createThread)
.forEach(t -> {
t.start();
worker.add(t);
});
//join Main线程等待所有子线程执行完毕
worker.forEach(t -> {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
public static Thread createThread(String name) {
return new Thread(() -> {
System.out.println(name + " -> 开始工作");
synchronized (CONTROLS) {
//最多使用五个线程去处理业务
while (CONTROLS.size() > MAX_CONTROL) {
try {
//超过5个线程全部wait(),这时候不会占用锁
CONTROLS.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
CONTROLS.addLast(new Control());
}
System.out.println(name + " -> 正在工作");
try {
//模拟工作耗时
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (CONTROLS) {
System.out.println("工作完毕");
//移除当前任务
CONTROLS.removeFirst();
//唤醒其他等待线程
CONTROLS.notifyAll();
}
}, name);
}
private static class Control {
}
}