Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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
Java 这个等待通知线程语义的真正目的是什么?_Java_Multithreading - Fatal编程技术网

Java 这个等待通知线程语义的真正目的是什么?

Java 这个等待通知线程语义的真正目的是什么?,java,multithreading,Java,Multithreading,我刚刚遇到一些代码,它使用wait-notify构造与类中定义的线程进行通信,线程由其其他成员方法定义。 有趣的是,在获得锁后,同步作用域中的所有线程都在同一个锁上定时等待(请参见下面的代码片段)。稍后,在非同步作用域中,线程执行其键函数(即“//do something useful1”) 我对这种机制的最佳猜测是,在其他线程调用“someMethod”之前,尽量减少线程的资源消耗。专家们怎么想?如果是这样,有什么更好的方法来实现这种行为 class SomeClass{ public

我刚刚遇到一些代码,它使用wait-notify构造与类中定义的线程进行通信,线程由其其他成员方法定义。 有趣的是,在获得锁后,同步作用域中的所有线程都在同一个锁上定时等待(请参见下面的代码片段)。稍后,在非同步作用域中,线程执行其键函数(即“//do something useful1”)

我对这种机制的最佳猜测是,在其他线程调用“someMethod”之前,尽量减少线程的资源消耗。专家们怎么想?如果是这样,有什么更好的方法来实现这种行为

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…
?引用时,您最好对其进行解释并提供指向资源的链接。即使源代码允许逐字复制,也应将其归属并显示为引用。引用时,您最好对其进行解释并提供指向资源的链接。即使源代码允许逐字复制仍应归属并显示为报价