Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 让一个线程等待另一个线程完成任务_Java_Multithreading - Fatal编程技术网

Java 让一个线程等待另一个线程完成任务

Java 让一个线程等待另一个线程完成任务,java,multithreading,Java,Multithreading,我有一个设置,其中有两组不同的线程执行两个不同的任务(对于那些想知道的人,组1计算字符串的SHA-256哈希,第二组将这些哈希与字典中的哈希进行比较)。从逻辑上讲,我希望创建所有组2线程,让它们等待,然后在每个组1线程计算哈希时,让所有组2线程“唤醒”,并检查计算出的哈希以检查匹配。这是我为第2组线程编写的代码,它使用一个名为“shared”的计算哈希共享字典 我该如何让这个线程等待“共享”哈希字典中的内容被添加?这看起来像一个典型的生产者/消费者程序。它通常通过在生产者线程和消费者线程之间共享

我有一个设置,其中有两组不同的线程执行两个不同的任务(对于那些想知道的人,组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);
    }
}