我有一個Java小程序。該applet中的一個類正在創建一個線程來完成一些工作,等待30秒完成該工作,如果該工作在30秒內沒有完成,它將設置一個布爾值來停止該線程。等待和布爾變化是同步的塊,這是必要的考慮沒有從這些2在這裏同步需要
System.out.println("Begin Start Session");
_sessionThread = new SessionThread();
_sessionThread.start();
synchronized (_sessionThread)
{
_sessionThread.wait(30000);
_sessionThread._stopStartSession = true;
}
一邊跑,爲什麼我不能只是這樣做,而不是沒有其他線程。
System.out.println("Begin Start Session");
_sessionThread = new SessionThread();
_sessionThread.start();
_sessionThread.wait(30000);
_sessionThread._stopStartSession = true;
SessionThread運行方法。調用一個JNI方法來調用一個dll來打開一個程序窗口。
public void run()
{
try
{
startExtraSession();
}
catch (Throwable t)
{
t.printStackTrace();
}
notify();
}
private native void openSessionWindow(String session_file);
private void startExtraSession()
{
final String method_name = "startExtraSession";
String title = _sessionInfo._title;
long hwnd = 0;
openSessionWindow(_sessionInfo._configFile);
try
{
//Look for a window with the predefined title name...
while ((hwnd = nativeFindWindow(title)) == 0 && !_stopStartSession)
{
Thread.sleep(500);
}
}
catch(Throwable t)
{
t.printStackTrace();
}
}
1.是否真的需要同步?
2.除了使用線程之外,還有更好的方法來完成這個嗎?
如果線程由班級擁有,他將從中調用同步部分,是否不符合此要求?自從我的Java時代已經很長時間了,所以請賜教。 – 2009-12-03 20:21:31
如果您在任何同步方法或任何同步塊之外,則您不擁有任何監視器,因此無法調用「wait」。讓我編輯我的答案在鎖定/監視器採集上更清晰一些。 – Romain 2009-12-04 08:12:46