我有一个任务将使用不同的值运行多次。我希望阻止它执行两个相同的任务(基于字符串值)。下面是字符串的一个示例。这些值将更改,但为了简单起见,我在示例中包含了以下这些值。我通过ExecutorService
提交这些任务。任务运行,但是第二个hi阻止了其他任务的运行。所以4/5的任务并发运行。一旦第一个hi的锁被释放,第五个任务继续运行,其他任务继续运行。是否有办法防止这种类型的任务阻塞,以便其他3个任务可以在它之前运行,从而在实际上有5个任务之前不会排队同时运行。
任务的提交:
executor.submit(new Task("hi"));
executor.submit(new Task("h"));
executor.submit(new Task("u"));
executor.submit(new Task("y"));
executor.submit(new Task("hi"));
executor.submit(new Task("p"));
executor.submit(new Task("o"));
executor.submit(new Task("bb"));
这个任务很简单,它只打印出字符串:
Lock l = getLock(x);
try {
l.lock();
System.out.println(x);
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
Logger.getLogger(Task.class.getName()).log(Level.SEVERE, null, ex);
}
} finally {
l.unlock();
}
我已经更新了帖子,让事情更清楚地理解...
1条答案
按热度按时间dhxwm5r41#
为了避免阻塞一个线程,你必须确保一个操作不会在另一个之前运行,例如,你可以使用
CompletableFuture
链接一个操作,在前一个操作完成后安排:ConcurrentHashMap
允许我们将这些情况作为原子更新来处理remove(key, job)
才会将其删除main
方法中的示例演示了两个独立的操作如何在包含两个线程的线程池中运行,而不会在线程处阻塞。