已尝试解决此问题,但事实证明很困难。
我有两个线程,一个是生产者,另一个是消费者。全部在不同的类(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/