public class Producer extends Thread {
static List<String> list = new ArrayList<String>();
public static void main(String[] args) {
ScheduledExecutorService executor = Executors
.newScheduledThreadPool(12);
int initialDelay = 5;
int pollingFrequency = 5;
Producer producer = new Producer();
@SuppressWarnings({ "rawtypes", "unused" })
ScheduledFuture schedFutureProducer = executor.scheduleWithFixedDelay(
producer, initialDelay, pollingFrequency, TimeUnit.SECONDS);
for (int i = 0; i < 3; i++) {
Consumer consumer = new Consumer();
@SuppressWarnings({ "rawtypes", "unused" })
ScheduledFuture schedFutureConsumer = executor
.scheduleWithFixedDelay(consumer, initialDelay,
pollingFrequency, TimeUnit.SECONDS);
}
}
@Override
public void run() {
list.add("object added to list is " + System.currentTimeMillis());
///adding in list become slow also because of synchronized behavior
}
}
class Consumer extends Thread {
@Override
public void run() {
getObjectFromList();
}
private void getObjectFromList() {
synchronized (Producer.list) {
if (Producer.list.size() > 0) {
System.out.println("Object name removed by "
+ Thread.currentThread().getName() + "is "
+ Producer.list.get(0));
Producer.list.remove(Producer.list.get(0));
}
}
}
}
只是为了澄清:'ExecutorService'只是一个接口。你可以在一个线程中执行'ExecutorService'类,它只要运行一个可运行的类就可以运行每个可运行的类(我相信'java.util.concurrent'包中有一个实现就是这么做的) 。但在实践中*,大多数ExecutorService实现是完整的生产者 - 消费者实现。 –
你是绝对正确的,通过'ExecutorService''我的意思是“*执行'ExecutorService' *”的'Executors.newFixedThreadPool()'返回的东西。感谢您的澄清。 –
谢谢你们。所以,如果我创建使用的newFixedThreadPool(8),然后就可以执行大约1000可运行任务的执行服务,请确认一下我的情况的理解: 1.最多8个线程将在处理开始创建 2 ,而8个线程正忙,992个任务将被保存在内部队列中 3.另外,因为它是一个无界队列,所以我可以提交给执行程序服务的任务数量没有上限。 如果我使用有界队列创建ExecutorService,上述场景会产生什么影响?它会表现更好吗? 谢谢,O. – Oxford