我了解到调用Object的wait()方法将释放对象监视器(如果存在).
但我有一些关于notify()通过另一个线程调用此对象的问题:
如果另一个(第3个)线程同时拥有对象监视器,那么等待线程是否会被唤醒?
如果第三个线程调用wait()此对象,那么等待线程会被唤醒吗?
是否可以确定线程是否在等待通知特定对象(java 1.4/java 5)
如果wait()在finalize()方法中调用会发生什么?
你好有好人,我需要一些帮助.
我正在写一个音乐播放器,它可以播放来自网络的音乐.如果我在音乐完成缓冲之前按下播放按钮,我希望它等待.
我尝试过这样的事情:
Object mutex = new Object();
public void main() {
startStreaming();
mutex.notify();
}
private void onClickPlayButton() {
mutex.wait();
}
Run Code Online (Sandbox Code Playgroud)
问题是,mutex.notify()如果没有按下playButton,则抛出一个" llegalMonitorStateException".你通常如何解决这样的问题?
编辑要说清楚.我的问题是:如何使按钮等待"startStreamning"方法完成?
我需要一个比Thread.Sleep更好的睡眠任务设计,我正在使用Task类.
在我的wpf应用程序中我运行一个任务,这个任务运行另外几个任务,每个任务首先登录到和互联网网站,他们登录后,他们需要等待几秒钟,并通知用户他们何时将继续进行,这是我的问题,因为使用Thread.Sleep我无法报告进度.
有比登录更多的功能,它大约是5-6,它们都要求一个互联网资源,而它们之间需要有一个休眠时间,剩余时间报告发送到gui,这个5-6功能都在一个任务中,但可能会有很多任务.
我需要的是让任务等待,但也允许它发送剩余时间的更新以继续GUI.
你对这个问题有什么想法,如何让它更好,也许你已经有一些设计模式已经解决了这个问题?
我也听说使用Thread.Sleep是一个糟糕的设计实践.
编辑:没人知道?什么样的自包含计时器与线程等待像waithandle,autoresetevent,任何人?
我有一个想要监视另一个程序的Bourne shell(/ bin/sh)脚本(为了便携性).它应该启动另一个程序,然后等待它退出.当第二个程序退出时,它会做一些最后的工作并退出.问题在于脚本需要响应信号(例如USR2)并在这些信号出现时做一些工作.
我天真的实施是:
#! /bin/sh
echo $$
trap 'echo Respond to USR2' USR2
/bin/sleep 120 &
pid=$!
wait $pid
echo $pid exited with $?
echo Doing final cleanup
Run Code Online (Sandbox Code Playgroud)
这不起作用.如果我发送shell SIGUSR2,陷阱会按预期触发,但是等待也完成,返回140./bin/sleep继续它的快乐方式.典型输出:
28849
Respond to USR2
28850 exited with 140
Doing final cleanup
Run Code Online (Sandbox Code Playgroud)
这个行为在dash和bash之间是一致的,我可以方便地访问两个Bourne shell派生物.
我目前的工作是旋转循环等待子PID消失,用kill进行探测.自旋循环似乎很浪费,并且扩大了窗口,如果PID被快速重用,我的脚本可能会错误地等待错误的进程.
#! /bin/sh
echo $$
trap 'echo Respond to USR2' USR2
/bin/sleep 15 &
pid=$!
while /bin/kill -0 $pid 2> /dev/null; do
echo waiting...
sleep 2
done
echo Doing final cleanup
Run Code Online (Sandbox Code Playgroud)
鉴于我的目标是同时等待另一个进程退出并能够响应信号,是否有更好的解决方案?
以下是我在Python中使用Selenium Webdriver尝试做的事情的描述:我的网站将特定产品的各种参数作为输入,并使用这些参数输出产品的价格.我保持除了一个参数之外的所有参数不变并在for循环中改变一个特定参数,以查看价格如何根据该特定参数变化.一旦我更改参数我提交表单然后我使用隐式等待如下:
submit_btn.click()
driver.implicitly_wait(10)
driver.find_element_by_name("Buy_Product")
soup=BeautifulSoup(driver.page_source)
Run Code Online (Sandbox Code Playgroud)
当输入第一组参数时,页面是清晰的,它不包含名称为"Buy_Product"的buttton,所以我使用的是
driver.find_element_by_name("Buy_Product")
Run Code Online (Sandbox Code Playgroud)
确保代码等待该按钮出现,这意味着该页面现在包含我想要提取的价格.问题是第二次通过循环,当我改变参数并尝试获得新价格时,按钮"Buy_Product"已经存在,所以隐式等待不再有效,有时它会在价格有时间之前采用之前的page_source要被更新.棘手的部分是有时甚至对于不同的参数价格是相同的,所以我不能只检查价格的可见文本是否已经改变.任何想法如何在不使用time.sleep的情况下解决这个问题?
请帮助我使用google geocoder.geocode.我知道这个函数运行异步,但我不知道如何处理它.
如何等待结果?这是我的代码:我的代码不等geocode.geocoder所以我得到undefined而不是geolocation.
<!DOCTYPE html>
<html>
<head>
<title>Geocoding service
</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="content-language" content="cs" />
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<link href="http://code.google.com//apis/maps/documentation/javascript/examples/default.css" rel="stylesheet">
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
<script>
function codeAddress(callback) {
var address = document.getElementById('address').value;
geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
} else {
alert('Geocode was not successful for the following reason: ' + status);
}
},callback);
}
function geocoder(result) {
alert(codeAddress());
}
function button() {
geocoder(codeAddress) ;
} …Run Code Online (Sandbox Code Playgroud) 我是WPF和C#的新手,请耐心等待.
我有一个主窗口打开一个新窗口.现在这个新窗口是一个提示是否覆盖文件,主窗口访问新窗口中的公共变量以检查提示的结果.
但我不能让主窗口处理等到新窗口关闭.
Window1 Win = new Window1();
Win.Show();
if (Win.pr_res == 1)
{
abc.Text = "File to be overwritten";
File.Delete(_destination);
Start();
}
else
{
abc.Text = "Operation Aborted";
}
Run Code Online (Sandbox Code Playgroud)
我尝试在主窗口中添加一个while循环检查另一个公共布尔值,但这只是挂起整个程序.
while(!_closecheck);
Run Code Online (Sandbox Code Playgroud)
欢迎任何建议.
我需要执行许多命令行脚本.它们目前存储在一个List.我想同时运行它们,并且只有在所有这些步骤完成后才继续执行下一步.
我已经尝试了下面显示的方法,但发现它缺乏,因为最后一个命令不一定最后结束.事实上,我发现最后一个命令甚至可以是第一个完成的命令.所以,我相信我需要类似的东西WaitForExit(),但在所有执行过程完成之前不会返回.
for (int i = 0; i < commands.Count; i++)
{
string strCmdText = commands[i];
var process = System.Diagnostics.Process.Start("CMD.exe", strCmdText);
if (i == (commands.Count - 1))
{
process.WaitForExit();
}
}
//next course of action once all the above is done
Run Code Online (Sandbox Code Playgroud) 我想暂停/等待 for 循环,直到window.speechSynthesis.speak(audio)完成阅读文本,然后再进行下一次迭代。我有以下代码:
var all = "Oak is strong and also gives shade \n \
Cats and dogs each hate the other \n \
The pipe began to rust while new \n Bye."
sentences = all.split('\n')
for (i = 0; i < sentences.length; i++) {
sentence = sentences[i]
console.log(sentences[i]);
audio = new SpeechSynthesisUtterance(sentence)
window.speechSynthesis.speak(audio)
}
Run Code Online (Sandbox Code Playgroud)
现在我想要的是,每个sentences[i]打印一次。在完成sentences[i]之前不会打印 下一个window.speechSynthesis.speak(audio),一旦语音完成,sentences[i] 则将打印下一次迭代。
那么我怎样才能让循环等到一个函数没有完成呢?
注意:我可以让它等待一个恒定的时间,但我想要一个动态的等待,即等待时间应该window.speechSynthesis.speak(audio)与完成文本所需的时间一样长。
std::atomic<T>两者std::condition_variable都有成员wait和notify_one功能。在某些应用程序中,程序员可以选择使用其中之一来实现同步目的。这些wait函数的目标之一是它们应与操作系统协调以最大程度地减少虚假唤醒。也就是说,操作系统应该避免唤醒wait-ing 线程,直到notify_one或notify_all被调用。
在我的机器上,sizeof(std::atomic<T>)issizeof(T)和sizeof(std::condition_variable)is 72。如果排除std::atomic<T>的T成员,则std::condition_variable保留 72 字节用于其同步目的,同时sizeof(std::atomic<T>)保留 0 字节。
我的问题:我应该期望std::condition_variables 和std::atomic<T>swait函数之间有不同的行为吗?例如,是否应该std::condition_variable减少虚假唤醒?