2015-09-22 27 views
-2

這是幾年前在IBM'developerworks站點發布的多線程測驗,現在不可用。有關多線程的測驗

的quize在問: 1.什麼是與此代碼 2.如何改善這種代碼

這個問題我不知道確切的答案,這個測驗是什麼。

class HelloRun implements Runnable{ 
    @Override 
    public void run() { 
     System.out.println(">>>" + Thread.currentThread().getName() + ": started"); 
     if(Thread.currentThread().getName().equals("one")){ 
      stepA();  
     } else { 
      stepB(); 
     } 
    } 

    private synchronized void stepB() { 
      System.out.println("started B"); 
      System.out.println("Do something"); 
      System.out.println("end B"); 
    } 

    private synchronized void stepA() { 
      System.out.println("started A"); 
      System.out.println("Do something"); 
      System.out.println("end A");   
    } 

    public static void main(String[] args) { 
     HelloRun helloRun = new HelloRun(); 

     Thread t1 = new Thread(helloRun, "one"); 
     Thread t2 = new Thread(helloRun, "two"); 
     t1.start(); 
     t2.start(); 
    } 
} 
+0

什麼答案?它會打印stepA()和stepB()打印語句。沒有必要同步,所以性能會很好。 – virendrao

+0

你有跑嗎? @virendrao:System.out.println的性能? –

+0

@Thomas我在說明爲什麼我們需要「同步」方法? – virendrao

回答

0

唯一的問題是,你可以交織消息出同步塊:

>>> one: started 
>>> two: started 
started B 
Do something B 
end B 
started A 
Do something A 
end A 

>>> one: started 
>>> two: started 
started A 
Do something A 
end A 
started B 
Do something B 
end B 

>>> one: started 
started B 
Do something B 
end B 
>>> two: started 
started B 
Do something B 
end B 

爲了解決這個交織可以添加同步到th運行方法而不是步驟A和步驟B.

相反,如果你可以交錯操作沒有問題,你可以從步驟A和步驟B刪除同步。

3

我想,問題是相同的Runnable用於兩個線程,它自己同步。因此線程不能實際並行執行stepAstepB。爲了解決這個問題,你可以創建兩個HelloRun實例:

Thread t1 = new Thread(new HelloRun(), "one"); 
Thread t2 = new Thread(new HelloRun(), "two"); 

或刪除​​關鍵字。

+0

同意你多數民衆贊成在我說什麼不需要同步 – virendrao

+1

@virendrao,如果它被認爲是一個更大的任務的一部分,那麼可能需要同步。目前的代碼無用,因爲'System.out.println'也是同步的,因此啓動線程只是爲了輸出stdout是瘋狂的想法。 –

+0

@virendrao - 除非我們知道代碼應該做什麼,否則我們不能說。而我們根本不知道。 –

0

在我看來這是一個設計問題。如果你想讓兩個線程做不同的事情,它不應該在一個類中實現。有一個乾淨的代碼原理叫做separation of concerns

此外,代碼包含magic numbers。一旦你改變了一個線程的名字,它就會完全不同,這是完全意想不到的。

正如Stephen C所提到的,您無法確切知道代碼應該做什麼,因此很難說它是否正確以及需要修復哪些錯誤。