public class Data {
private String id;
private String name;
public Data(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Data{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class Provider implements Runnable {
private BlockingQueue<Data> queue;
private volatile boolean isRunning = true;
private static AtomicInteger count = new AtomicInteger();
private static Random r = new Random();
public Provider(BlockingQueue<Data> queue) {
this.queue = queue;
}
@Override
public void run() {
while (isRunning) {
try {
//随机休眠0-1000毫秒,表示获取数据(产生数据的耗时)
Thread.sleep(r.nextInt(1000));
//获取的数据进行累计...
int id = count.incrementAndGet();
Data data = new Data(Integer.toString(id), "数据" + id);
System.out.println("当前线程:" + Thread.currentThread().getName() + ", 获取了数据,id为:" + id + ",进行装在到公共缓冲区中...");
if (!this.queue.offer(data, 2, TimeUnit.SECONDS)) {
System.out.println("提交缓冲区数据失败...");
//do something...比如重新提交
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void stop() {
isRunning = false;
}
}
import java.util.Random;
import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable {
private BlockingQueue<Data> queue;
private static Random r = new Random();
public Consumer(BlockingQueue<Data> queue) {
this.queue = queue;
}
@Override
public void run() {
while (true) {
try {
//获取数据
Data data = this.queue.take();
//进行数据处理,休眠0-1000毫秒,模拟耗时
Thread.sleep(r.nextInt(1000));
System.out.println("当前线程:" + Thread.currentThread().getName() + ",消费成功,消费数据为id:" + data.getId());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
public class Main {
public static void main(String[] args) {
BlockingQueue<Data> queue = new LinkedBlockingDeque<>(10);
Provider p1 = new Provider(queue);
Provider p2 = new Provider(queue);
Provider p3 = new Provider(queue);
Consumer c1 = new Consumer(queue);
Consumer c2 = new Consumer(queue);
Consumer c3 = new Consumer(queue);
ExecutorService cachePool = Executors.newCachedThreadPool();
cachePool.execute(p1);
cachePool.execute(p2);
cachePool.execute(p3);
cachePool.execute(c1);
cachePool.execute(c2);
cachePool.execute(c3);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
p1.stop();
p2.stop();
p3.stop();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}