我正在通過一本關於線程/同步的簡單示例,聲明使用將允許通過在同一實例上調用一個線程來訪問該方法。它按照承諾序列化,但似乎在第二個之前,下面的Synch
main
方法中創建的第三個Caller
約9/10倍。此代碼是顯示沒有同步方法的問題的示例代碼。爲什麼不是主序列中的呼叫?
class CallMe {
void call(String msg) {
System.out.print("[" + msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("CallMe Interrupted");
}
System.out.println("]");
}
}
class Caller implements Runnable {
String msg;
CallMe target;
Thread t;
public Caller (CallMe target, String msg) {
this.target = target;
this.msg = msg;
t = new Thread(this);
t.start();
}
@Override
public void run() {
target.call(msg);
}
}
class Synch {
public static void main(String args[]) {
CallMe target = new CallMe();
Caller c1 = new Caller(target, "Hello");
Caller c2 = new Caller(target, "Synchronized");
Caller c3 = new Caller(target, "World");
try {
c1.t.join();
c2.t.join();
c3.t.join();
} catch (InterruptedException e) {
System.out.println("Synch Interrupted");
}
}
}
該書顯示了兩種方式來處理這個問題,他們是 -
synchronized void call(String msg) {...}
和
public void run() { synchronized (target) {...} }
很顯然,這兩種選擇工作,因爲,相對於原來的代碼,括號內的字是一致喜歡...
[你好]
【世界】(時間約90%的電話是向後)
[同步](1 /許多人同步爲第一MSG)
...有沒有無緣無故的原代碼。所以我知道它是「工作的」,並且可以通過在每個Caller
實例化中放置斷點來直接看到它。它每次都有效,當我這樣做的時候,對我來說很明顯。
爲什麼第三個Caller
在第二個之前一直呼叫call
?
謝謝,我會接受你的建議。我認爲這個示例代碼只是爲了演示,我不認爲這不是一個非常有用的異常處理。 – ChiefTwoPencils
如果你對此感到滿意,你能否接受答案:) –
當然,你能告訴我應該得到什麼樣的編譯器警告,我沒有得到嗎? – ChiefTwoPencils