Java 这个等待通知线程语义的真正目的是什么?
我刚刚遇到一些代码,它使用wait-notify构造与类中定义的线程进行通信,线程由其其他成员方法定义。 有趣的是,在获得锁后,同步作用域中的所有线程都在同一个锁上定时等待(请参见下面的代码片段)。稍后,在非同步作用域中,线程执行其键函数(即“//do something useful1”) 我对这种机制的最佳猜测是,在其他线程调用“someMethod”之前,尽量减少线程的资源消耗。专家们怎么想?如果是这样,有什么更好的方法来实现这种行为Java 这个等待通知线程语义的真正目的是什么?,java,multithreading,Java,Multithreading,我刚刚遇到一些代码,它使用wait-notify构造与类中定义的线程进行通信,线程由其其他成员方法定义。 有趣的是,在获得锁后,同步作用域中的所有线程都在同一个锁上定时等待(请参见下面的代码片段)。稍后,在非同步作用域中,线程执行其键函数(即“//do something useful1”) 我对这种机制的最佳猜测是,在其他线程调用“someMethod”之前,尽量减少线程的资源消耗。专家们怎么想?如果是这样,有什么更好的方法来实现这种行为 class SomeClass{ public
class SomeClass{
public void run() {
while (!isShuttingDown){
try {
synchronized (SomeClass.class) {
SomeClass.class.wait(500);
}
} catch (Throwable e) {
LOGGER.info(SomeClass.class.getSimpleName() + " reaper thread interrupted", e);
}
//do something useful1
}
}
public synchronized void someMethod(){
//do something useful2
synchronized (SomeClass.class) {
SomeClass.class.notifyAll();
}
//do something useful3
}
}
如上所述
wait notify模式用于多种情况,其中
线程需要告诉其他线程发生了某些事件。它是
通常用于实现线程池或生产者-消费者
场景,其中一个或多个特定线程需要“拾取作业”
由其他线程创建(在本例中为已发生的“事件”)
是一个作业已到达,其中一个线程要拾取)
如上所述
wait notify模式用于多种情况,其中
线程需要告诉其他线程发生了某些事件。它是
通常用于实现线程池或生产者-消费者
场景,其中一个或多个特定线程需要“拾取作业”
由其他线程创建(在本例中为已发生的“事件”)
是一个作业已到达,其中一个线程要拾取)
获取锁后,同步作用域中的所有线程都在同一个锁上等待(请参见下面的代码段)
是的,图案很奇怪。通常,我有一个类似的循环(尽管我总是使用一个私有最终锁定对象
),它会等待一小段时间,因为我不想让方法旋转——太频繁地执行它的任务
我本以为另一个方法会锁定同一个变量,然后更新isShuttingDown
标志。但是,执行其他的//有用的#
部分是一种奇怪的模式,因为代码中存在许多竞争条件,这将使确定有用部分的顺序变得不可能
获取锁后,同步作用域中的所有线程都在同一个锁上等待(请参见下面的代码段)
是的,图案很奇怪。通常,我有一个类似的循环(尽管我总是使用一个私有最终锁定对象
),它会等待一小段时间,因为我不想让方法旋转——太频繁地执行它的任务
我本以为另一个方法会锁定同一个变量,然后更新
isShuttingDown
标志。但是,执行其他的//有用的#
部分是一种奇怪的模式,因为代码中存在许多竞争条件,这将使确定有用部分的顺序变得不可能。您没有给我们提供足够的上下文。关键部分将在“做一些有用的事情”部分。例如,这实际上可能是一个生产者/消费者队列。我读过这篇文章:如果我理解正确,生产者/消费者将在同步范围内执行一些有用的活动(即在获取锁之后)。但是,在这种情况下,在synchronized scope.@drop.in.ocean中没有什么有用的方法:它通常会从队列中处理该项,但仅此而已。这可能是类似的情况,但并不完全相同。但从根本上说,这确实使一个线程等待另一个线程到达someMethod
的中间部分。这就是我们目前所能说的……为什么您要用catch(可丢弃的…
)替换catch(IOException…
)?您没有给我们提供足够的上下文。关键部分将在“做一些有用的事情”中例如,这可能是一个生产者/消费者队列。我已经读过了:如果我理解正确,生产者/消费者将在同步范围内执行一些有用的活动(即,在获得锁后)。但是,在这种情况下,在同步范围内没有任何有用的操作。@drop.in.ocean:通常会从队列中处理项目,但仅此而已。这可能是类似的情况,但并不完全相同。但从根本上说,这确实会使一个线程等待另一个线程到达线程的中间部分e> someMethod。这就是我们目前所能说的……为什么要用catch替换catch(IOException…
(Throwable…
?引用时,您最好对其进行解释并提供指向资源的链接。即使源代码允许逐字复制,也应将其归属并显示为引用。引用时,您最好对其进行解释并提供指向资源的链接。即使源代码允许逐字复制仍应归属并显示为报价