Java 可能存在或不存在其他线程时的线程同步

Java 可能存在或不存在其他线程时的线程同步,java,multithreading,synchronization,Java,Multithreading,Synchronization,我有一个执行一些计算的线程,每个计算都有一个id。 每次计算都会启动一个新线程。 处理完成后,数据将写入与其id对应的数据库中 可能有(可能有也可能没有)另一个请求,这需要来自另一个线程的计算结果。 它在数据库中查找id,如果找到,将返回结果。 如果没有,则需要检查是否已在进行计算 如果是,请等待计算完成。唤醒完成后,从数据库获取数据并返回。 如果没有运行计算,请启动计算并等待。唤醒完成后,从数据库获取数据并返回 The pseudo code is as follow: Calculation

我有一个执行一些计算的线程,每个计算都有一个id。 每次计算都会启动一个新线程。 处理完成后,数据将写入与其id对应的数据库中

可能有(可能有也可能没有)另一个请求,这需要来自另一个线程的计算结果。 它在数据库中查找id,如果找到,将返回结果。 如果没有,则需要检查是否已在进行计算 如果是,请等待计算完成。唤醒完成后,从数据库获取数据并返回。 如果没有运行计算,请启动计算并等待。唤醒完成后,从数据库获取数据并返回

The pseudo code is as follow:
CalculationClass
    receive a request id from a Consumer
    add id to CalculatingIds List
    when calculated
        write data to DB
        remove id from CalculatingIds List

GetDataClass
    look for the the result corresponding to id
    if found return data
    else check if the id is present in the CalculatingIds List
        if present, wait and wake up when data is available
        if not present, pass the id to the Consumer Queue. Wait and wake up when data is available
我无法找到一种方法,在数据尚未准备好用于GetDataClass的情况下同步这两个线程。我在考虑为每次计算创建一个新对象,然后使用它来同步两个线程

synchronize(lock)
  if(noData && calculationRunning)
    lock.wait();
  else
    queue.add(id)
    CalculatingIds.add(id)
但是在
CalculationClass
的情况下,我将如何处理此锁?
GetDataClass
线程不存在时,我将如何处理这种情况?

有一个跟踪当前正在处理的内容的集合。用锁保护它。处理特定项的线程在保持集合锁的同时发出通知。完成后,它获取集合上的锁,删除条目,并通过调用
notifyAll
通知任何其他线程。如果一个线程在持有集合锁的同时从另一个线程找到一个条目,它将循环
等待
,直到通知另一个线程已完成。

我恐怕不能完全理解它。你想让我帮你锁上收藏?但我该如何通知和等待呢。请您详细解释一下。您知道如何使用像
notifyAll
wait
这样的函数吗?如果没有,你还没有准备好做这样的事情。开始(在持有保护您正在等待或通知的共享状态的锁的同时调用
notifyAll
wait
是完全正常的。)实际上,您的伪代码中几乎都有它。你懂伪代码吗?是的,我当然懂。没有意义的是我将如何使用锁来同步它。对于
GetDataClass
我有伪代码,但是如何在
CalculationClass
中协调此监视器?在
CalculationClass
中的锁在哪里?如何通知
GetDataClass
?我在哪里初始化这个锁?