Java多线程问题——消费者/生产者模式

标签 java multithreading concurrency locking java.util.concurrent

已尝试解决此问题,但事实证明很困难。

我有两个线程,一个是生产者,另一个是消费者。全部在不同的类(class)。两个线程独立运行。制作人汇集了大约 8-12 个文件夹作为输入。然后,它同时翻译所有文件并将其放置在名为“readyToLoad”的共享文件夹中。 一旦生产者线程完成,消费者线程现在进入“readyToLoad”文件夹并开始处理翻译后的文档。

现在的问题是,当使用者处理翻译后的文档时,它不允许制作者将更多翻译后的文件放入“readyToLoad”文件夹中。

我的问题是,如何防止消费者锁定“readyToLoad”文件夹?我该如何应对这种情况?

对长文本表示歉意,但我觉得这将有助于理解我遇到问题的地方。感谢大家的帮助。

更新:添加了消费者代码(在加载过程中执行加载并锁定文件的代码)

public class LoadManager {
protected static final Logger logger = KCLogger.getLogger();
 ArrayList<Loader> threads = new ArrayList<Loader>();
 KCBLConfig config;
 private static final ExecutorService service = Executors.newFixedThreadPool(10);
 public LoadManager(KCBLConfig config) {
    this.config = config;
 }

public void start() throws Exception {
    logger.log(Level.INFO, "Starting loading threads.");
    try {
        TreeMap<String, ConnectionHandler> connectionHandlers = config.getConnectionHandlers();
        Iterator i = connectionHandlers.keySet().iterator();
        while (i.hasNext()) {

            ConnectionHandler connectionHandler = connectionHandlers.get((String) i.next());

            for (LoadFolder loadFolder : connectionHandler.getKcXMLFolders()) {
               Loader loader = new Loader(loadFolder.getId(), loadFolder, config.getConnectionHandlers());
               Thread loaderThread = new Thread(loader);
                loaderThread.start();   
               //service.submit(loader);
              // service.shutdown();
               //service.awaitTermination(1, TimeUnit.MILLISECONDS);
                threads.add(loader);
            }
        }
    } catch (Exception e) {
        logger.log(Level.SEVERE, "There was an error starting the loaders. Stopping all loader threads.", e);
        this.stop();
        throw e;
    }
    logger.log(Level.INFO, "All loader threads created. There are " + threads.size() + " loader threads");
}

最佳答案

Java 生产者/消费者习惯用法现在通常使用 BlockingDeque 来完成。

我将为生产者和消费者建立单独的文件夹。为什么要承担如此复杂的任务?

关于Java多线程问题——消费者/生产者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17742702/

相关文章:

java - 计算圆周上一点的角度

java - 在插入表之前清理数据

java - Quartz 中可以推迟触发触发吗?

java - 两次调用 Wea​​kHashMap.put(..) 背后的原因是什么?

c# - 消费者线程如何将结果返回给正确的生产者线程?

java - 初始化抽象类的一般变体

java - 将 LWJGL Java 游戏移植到 XBOX

java - 如何重现代码规范中提到的多线程错误?(TSM03-J。不要发布部分初始化的对象)

java - 在 Quasar 中调度任务,无需生成新线程

ios - 在 swift 中创建简单的线程会出错