2015-09-23 164 views
0

以下是一個示例程序。同步方法

當前的行爲是,waitandsweep方法被A調用,然後執行一些工作。當A在等待時,B正在調用等待某個時間並執行相同工作的相同方法。

爲A和B的等待時間將是1000

我預期的行爲是B的調用方法前等待,而等待等待時間和執行工作。

意思是,A的等待時間必須是1000,而B的等待時間必須是1000 + 1。

public class Wait { 
    long waitTime =1000; 
    Object lock = new Object(); 
    boolean flag = true; 
public static void main(String args[]){ 
    final Wait wait = new Wait(); 

//Create two threads: 
Thread thread1 = new Thread() { 
    public void run() { 
    wait.A(); 
    } 
}; 

Thread thread2 = new Thread() { 
    public void run() { 
    wait.B(); 
    } 
}; 

thread1.start(); 
thread2.start(); 

} 
public synchronized void A(){ 
    waitAndSweep("A"); 
} 

public synchronized void B(){ 
    waitAndSweep("B"); 
} 
protected void waitAndSweep(String caller) { 


    try { 

    long waitTime = getWaitTime(); 

    if (waitTime > 0) 
     wait(waitTime); 
    SomeWork(); 
    System.out.println(caller + waitTime); 

    } catch (Exception e) { 

    } 
} 
private void SomeWork() { 
    this.waitTime = this.waitTime + 1; 

} 
public long getWaitTime() { 
    return waitTime; 
} 
public void setWaitTime(long waitTime) { 
    this.waitTime = waitTime; 
} 


} 

電流輸出: A1000 B1000

預期輸出: A1000 B1001

我認爲我們需要做一些鎖定通知邏輯。

由於我不知道這一點,有人可以幫助我嗎?

+1

您用[標籤:java]標記了這個問題,但我在這裏看不到任何代碼... –

+0

請澄清更多。你希望線程A等待1000毫秒執行,並且比B等待1001毫秒執行? – virendrao

+0

抱歉錯過了添加代碼。 – user5367186

回答

0

就標誌着waitAndSweep如同步:public synchronized void waitAndSweep() { ... }

參見:http://tutorials.jenkov.com/java-concurrency/synchronized.html

+0

創建同步的方法。你的線程B不會鎖定(執行)該方法,直到線程A釋放鎖定方法。 –

+0

@MainshPrajapati同步waitandsweep方法沒有奏效。由於First A進入等待掃描等待1000ms,同時B進入等待掃描等待1000ms。因爲waitTime僅在A執行後纔會改變SomeWork() – user5367186

0

創建一個同步的方法。

線程B在方法釋放鎖定之前不會鎖定(執行)該方法。