package com.thread.demo.unit2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/**
* @Author: Peacock__
* @Date: 2019/5/5 15:27
*/
public class CaptureData {
/**
* 模拟10个线程抓取数据,限制一次性最多有5个线程工作
*/
//保护对象
private static final LinkedList<Control> CONTROL = new LinkedList<>();
private static final Integer MAX_COUNT = 5;
public static void main(String[] args) {
//定义10个线程
List<Thread> workers = new ArrayList<>();
Arrays.asList("M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10").stream().map(CaptureData::create).forEach(t -> {
t.start();
workers.add(t);
});
//join主线程,以便查看控制台数据结果
workers.stream().forEach(t -> {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
private static Thread create(String name){
return new Thread(name){
@Override
public void run() {
synchronized (CONTROL){
System.out.println(Thread.currentThread().getName()+" START");
while(CONTROL.size() > MAX_COUNT){
try {
//若已经在工作的线程数大于MAX_COUNT时,再进来的线程需要等待
CONTROL.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
CONTROL.addLast(new Control());
}
System.out.println(Thread.currentThread().getName()+" WORKING");
try {
//假装在执行工作,耗时10秒
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (CONTROL){
System.out.println(Thread.currentThread().getName()+" END");
//一个线程执行完毕后,将其移除,并唤醒等待的线程
CONTROL.removeFirst();
CONTROL.notifyAll();
}
}
};
}
static class Control{
}
}
控制台输出
M1 START
M1 WORKING
M6 START
M6 WORKING
M2 START
M2 WORKING
M7 START
M7 WORKING
M4 START
M4 WORKING
M3 START
M3 WORKING
M5 START
M10 START
M8 START
M9 START
M6 END
M9 WORKING
M1 END
M5 WORKING
M7 END
M8 WORKING
M3 END
M10 WORKING
M2 END
M4 END
M5 END
M9 END
M8 END
M10 END
Process finished with exit code 0