【问题标题】:Java Thread which waits for new objects in collectionJava线程等待集合中的新对象
【发布时间】:2021-05-02 16:57:42
【问题描述】:

我有一个线程应该在新对象添加到集合时执行一些操作。此集合由几个 Callables 修改。等待新元素的线程应该在一段时间后通过布尔标志“停止”轻松停止。

实现它的可能方法是什么?我没有找到实现它的好例子。

【问题讨论】:

  • 您在寻找(阻塞)队列吗?
  • 是的,这是可能的解决方案,但我不想使用 while(运行 || !queue.isEmpty())创建无限循环。所以现在,我想回顾一下其他选项。
  • 但你不使用 queue.isEmpty() 与阻塞队列。
  • @TestName 我只是好奇“无限循环”有什么问题?带有 .take() 的 BlockingQueue + 无限循环 + 带有 interrupt() 方法的线程中断(而不是自定义的 volatile 标志)是管理像您这样的案例的规范方法。还有其他特定的东西,例如 Disruptor 等,但它们满足非常特定的要求,例如无 GC、低延迟等。

标签: java multithreading collections concurrency


【解决方案1】:

好吧,您可以将您的集合包装在一个自定义集合中并注册一个侦听器。以LinkedBlockingQueue 为例:

public class MyCollection<T> extends LinkedBlockingQueue<T> {
    
    private final MyListener<T> listener;

    public MyCollection(MyListener<T> listener) {
        this.listener = listener;
    }

    @Override
    public void put(T t) throws InterruptedException {
        super.put(t);
        listener.onPut(t);
    }
    
}
public class MyListener<T> {
    
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    
    public void onPut(T t) {
            executorService.submit(() -> doSomething(t));
    }
    
    public void stop() {
        executorService.shutdown();
        // optional call to awaitTermination() here..
    }
    
}

【讨论】:

    猜你喜欢
    • 2011-09-10
    • 2020-10-24
    • 2015-11-06
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    相关资源
    最近更新 更多