这是线程正在等待notify()或超时的情况.这里添加了一个while循环来处理虚假唤醒.
boolean dosleep = true;
while (dosleep){
try {
wait(2000);
/**
* Write some code here so that
* if it is spurious wakeup, go back and sleep.
* or if it is timeout, get out of the loop.
*/
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我如何区分虚假唤醒和超时?如果它是一个虚假的醒来,我需要回去等待.如果是超时,我需要退出循环.
我可以很容易地识别notify()的情况,因为我将在notify()调用时将dosleep变量设置为false.
编辑:由于嵌入式项目的要求,我使用的是1.4版java.我不能使用,Condition因为它只在1.5后可用.
提前致谢.
我几乎已经解决了这个问题,但我认为我需要朝着正确的方向努力.
我想要做的事每五秒钟,直到或者一定的时间量已过去或用户中断它(在这种情况下,完成循环的该迭代完成之前).
import time
import threading
def do_something():
T0 = time.clock()
while (time.clock() - T0) < 60 and not e.isSet(): #as long as 60s haven't elapsed
#and the flag is not set
#here do a bunch of stuff
time.sleep(5)
thread = threading.Thread(target=do_something, args=())
thread.start()
e = threading.Event()
while thread.isAlive():
#here I want the main thread to wait for a keypress and, if it receives it,
#set the event e, which will cause the thread to finish …Run Code Online (Sandbox Code Playgroud) 我必须在我的Android应用程序中等待几秒钟,我想在此期间显示进度条,我该怎么做?
我试过这个代码:
public boolean WaitTask() {
pDialog = ProgressDialog.show(context,null, "Lädt..",true);
new Thread() {
public void run() {
try{
// just doing some long operation
sleep(2000);
} catch (Exception e) { }
pDialog.dismiss();
}
}.start();
return true;
}
Run Code Online (Sandbox Code Playgroud)
但是进度条立即关闭而不等待两秒钟.我的问题在哪里?
进度条应该类似于Android开发者在此站点中显示的活动圈.
更新 AsyncTask
private class WaitTime extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mDialog.show();
}
protected void onPostExecute() {
mDialog.dismiss();
}
@Override
protected void onCancelled() {
mDialog.dismiss();
super.onCancelled();
}
@Override
protected Void doInBackground(Void... params) {
long …Run Code Online (Sandbox Code Playgroud) 我是C#的新手并且正在使用Task.我试图运行这个应用程序但我的应用程序每次都挂起.当我添加时task.wait(),它会一直等待,永远不会返回.任何帮助深表感谢.编辑:我想异步调用DownloadString.当我按照"Austin Salonen"的建议执行task.Start()时,我没有得到位置的地址,而是从returnVal获取位置字符串中的默认值.这意味着在任务完成之前,位置得到了值.如何确保在任务完成后只有位置被指定returnVal.
public class ReverseGeoCoding
{
static string baseUri = "http://maps.googleapis.com/maps/api/geocode/xml?latlng={0},{1}&sensor=false";
string location = "default";
static string returnVal = "defaultRet";
string latitude = "51.962146";
string longitude = "7.602304";
public string getLocation()
{
Task task = new Task(() => RetrieveFormatedAddress(latitude, longitude));
//var result = Task.Factory.StartNew(RetrieveFormatedAddress("51.962146", "7.602304"));
task.Wait();
//RetrieveFormatedAddress("51.962146", "7.602304");
location = returnVal;
return location;
}
public static void RetrieveFormatedAddress(string lat, string lng)
{
string requestUri = string.Format(baseUri, lat, lng);
using (WebClient wc = new WebClient())
{
wc.DownloadStringCompleted …Run Code Online (Sandbox Code Playgroud) 所以我需要制作一个电梯模拟器,我想知道如何不断地让人们打电话给电梯.我需要这个永远继续下去.所以基本上创建一个人并呼叫电梯.所有这些电话都被跟踪,但我想我需要跟踪实际上在电梯上的人.
我有几个班Person,Elevator,ElevatorCall和ElevatorCallQueue.
在Person中,我有一个run()方法,它基本上使用当前楼层和目的地楼层进行电梯呼叫,然后我有一个BlockingQueue我打电话的方法.这个run方法只运行true.
在ElevatorCall我只有收集和目的地楼层的getter和setter
在ElevatorCallQueue中,我有MAX_CALLS和numberOfPeople的变量.我有一个BlockingQueue<ElevatorCall> queue = new ArrayBlockingQueue<ElevatorCall>(MAX_CALLS)
和一个List<Person>
我在列表中添加人员,我浏览列表并run()在每个人上启动方法.最后,我创建了一个电梯并提供队列,然后运行它.
在电梯我有BlockingQueue<ElevatorCalls>.我在while(true这里也有a ),在里面我做了一个ArrayList<ElevatorCall>然后我使用了ArrayList<ElevatorCalls>作为参数的BlockingQueues drainTo方法.该run()方法的其余部分基本上遍历数组列表并执行电梯所做的事情,因此它转到第一个按下的按钮,检查每个楼层的人员以及它是否是目的地楼层.
现在我已经卡住了,不知道从哪里开始.我需要一些人们如何连续添加并呼叫电梯,并且如果没有更多呼叫,让电梯等待.如果有人能帮助我朝着正确的方向前进,我将不胜感激.谢谢
编辑
这是电梯类的代码,因为有人说我应该发布一些代码.但是我不确定要发布什么代码,所以我想我只是放入整个班级
我的代码中有这一行:
t = wait(&status);
Run Code Online (Sandbox Code Playgroud)
当子进程工作时,status的值为0.
但是为什么它不起作用时会返回256?为什么改变子进程给予退出参数值时存在错误不会改变任何东西(出口(2)而不是exit(1)例如)?
谢谢
编辑:我在linux上,我用GCC编译.
我定义了这样的状态
int status;
t = wait(&status);
Run Code Online (Sandbox Code Playgroud) 基本上我试图使用JavaFX做一个简短的效果.我有一个心脏的形状(从两个圆圈和一个多边形加起来),我可以使用double值改变大小p."标准尺寸"将是p = 1.0;.
我试图给心脏增加一个泵效应.我有方法pumpOnce():
public void pumpOnce(){
p = p + 1;
initHeart();
//Here goes what ever it takes to make stuff working!!
p = p - 1;
initHeart();
}
Run Code Online (Sandbox Code Playgroud)
initHeart()吸取内心的基础p.
我发现Thread.sleep();由于JavaFX中的线程原理,或类似的方法不起作用.
但是我可以用什么呢?
我正在使用ProcessBuilder类和Process类从java执行.exe文件.解释我在做什么:
builder = new ProcessBuilder(commands);
builder.redirectErrorStream(true);
Process process = builder.start();
process.waitFor();
Run Code Online (Sandbox Code Playgroud)
我只是想知道,"waitFor()"等待多久了?是等待我的.exe执行,还是等到执行结束?
我的.exe是一个已编译的AutoIt脚本.这意味着,可能会有像鼠标移动这样的交互,这需要一些时间.因此,我需要知道在调用.exe之后我的Java代码执行是否继续,或者它是否真的在等待它.
我想要实现的是两个脚本的旋转执行,但我担心,我的Java代码正在执行第二个脚本,而第一个脚本仍在运行.有没有人解决这个问题?我很高兴有任何想法.
synchronized (Foo.class) {
while (someCondition) {
try {
Foo.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
似乎这个线程在其他一些线程调用时interrupt()或notify()在此线程上都会唤醒.这两者有什么不同吗?
- 编辑 -
我知道一个用于通知一个对象,另一个用于中断一个线程.但是这两者都导致了相同的结果,也就是说,这个线程被唤醒了,所以我想问的是这两种情况的后果是如何相互不同的.
例如:
public synchronized Object get() {
while (result == null) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
// Do we own the monitor of this object?
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
当e.printStackTrace()执行,是我们保证自己的对象的显示器呢?
引用说当wait()在一个notify()或者notifyAll()调用之后返回时,线程会等待它获取对象的监视器.但wait()抛出异常时的情况呢?
wait ×10
java ×5
concurrency ×2
android ×1
c ×1
c# ×1
console ×1
google-api ×1
interruption ×1
javafx ×1
keypress ×1
notify ×1
process ×1
progress-bar ×1
python ×1
synchronized ×1
task ×1
thread-sleep ×1
timeout ×1