Java 让一个线程等待另一个线程完成任务
我有一个设置,其中有两组不同的线程执行两个不同的任务(对于那些想知道的人,组1计算字符串的SHA-256哈希,第二组将这些哈希与字典中的哈希进行比较)。从逻辑上讲,我希望创建所有组2线程,让它们等待,然后在每个组1线程计算哈希时,让所有组2线程“唤醒”,并检查计算出的哈希以检查匹配。这是我为第2组线程编写的代码,它使用一个名为“shared”的计算哈希共享字典Java 让一个线程等待另一个线程完成任务,java,multithreading,Java,Multithreading,我有一个设置,其中有两组不同的线程执行两个不同的任务(对于那些想知道的人,组1计算字符串的SHA-256哈希,第二组将这些哈希与字典中的哈希进行比较)。从逻辑上讲,我希望创建所有组2线程,让它们等待,然后在每个组1线程计算哈希时,让所有组2线程“唤醒”,并检查计算出的哈希以检查匹配。这是我为第2组线程编写的代码,它使用一个名为“shared”的计算哈希共享字典 我该如何让这个线程等待“共享”哈希字典中的内容被添加?这看起来像一个典型的生产者/消费者程序。它通常通过在生产者线程和消费者线程之间共享
我该如何让这个线程等待“共享”哈希字典中的内容被添加?这看起来像一个典型的生产者/消费者程序。它通常通过在生产者线程和消费者线程之间共享一个线程来解决
生产者线程将值放入队列,消费者线程从队列中获取值。在元素可用之前,队列会阻止使用者线程。如果队列包含太多元素,则生产线程也可能被队列阻塞。使用BlockingQueue,我们可以完成此任务。根据Java文档“一个队列,它还支持在检索元素时等待队列变为非空,并在存储元素时等待队列中的空间变为可用的操作。”
更多信息请参阅右侧的相关信息?OP的可能副本不希望等待线程完成。阅读问题。我确实看到了相关部分中提出的问题,但我认为join()不是我想要的。如果我问的问题不清楚,我道歉!我不知道这个存在。感谢你的回答!看起来,如果我想使队列具有(相对)不确定的大小,我可以使用LinkedBlockingQueue,因为我不知道这个队列中可以有多少元素。是的。但是限制队列的大小有助于避免消耗太多内存,并确保生产者不会以生产者无法承受的速度向队列添加值。一旦达到限制,制作人将开始被阻止,限制他们的速度,并确保内存使用不会无限攀升。但如果我限制大小,有一个逻辑问题。假设有200个第1组线程(我正在为从字典计算的每个散列创建一个线程,因此200行==200个线程)。如果我将队列的大小限制为200,并且组1引用的字典中没有这200个哈希值,那么理论上我会陷入死锁,所有线程都会被阻塞。我不太明白您想要实现什么,但是200个不执行IO的线程太多了。不应创建线程来执行单个短任务。相反,它们应该一次性创建,并被重用以执行许多短任务。使用线程池。请参见
java.util.concurrent.Executors
。
private static class Group2Th implements Runnable {
private String dbUser;
private String dbHashedPass;
private SharedDict shared;
public Group2Th(String dbUser, String dbHashedPass, SharedDict shared) {
this.dbUser = dbUser;
this.dbHashedPass = dbHashedPass;
this.shared = shared;
}
public void run() {
System.out.println("Hello from G2 Thread: " + this.dbUser + " ==> " + this.dbHashedPass);
}
}