2013-11-26 22 views
0

我有一個像下面這樣的例子。它使用兩個內部類,它們可以直接訪問其封閉實例的方法和字段。是否有意義不使用內部類?以及如何修改它。如何改變沒有內部類?

package java_example150; 

public class TestThread3{ 
    private int j; 
    public static void main(String[] args){ 
     TestThread3 t = new TestThread3(); 
     Inc inc = t.new Inc(); 
     Dec dec = t.new Dec(); 

     for(int i=0;i<2;i++){ 
      Thread ts = new Thread(inc); 
      ts.start(); 
      ts= new Thread(dec); 
      ts.start(); 
     } 
    } 

    private synchronized void inc(){ 
     j++; 
     System.out.println(Thread.currentThread().getName()+"-inc:"+j); 
    } 

    private synchronized void dec(){ 
     j--; 
     System.out.println(Thread.currentThread().getName()+"-dec:"+j); 
    } 

    class Inc implements Runnable{ 
     public void run(){ 
     for(int i=0;i<10;i++){ 
     inc(); 
     } 
     } 
    } 

    class Dec implements Runnable{ 
     public void run(){ 
      for(int i=0;i<10;i++){ 
      dec(); 
      } 
     } 
    } 

} 

回答

0

在你的例子中,我不認爲有必要重構它。你可以這樣離開它。只有當其他類需要內部類時,纔可以使用內部類,並且只能由此類訪問/實例化。

如果您在另一個類中需要相同的功能,可以重構它並將這些類移動到單獨的文件中。

0

線程需要有一個Runnable類型作爲線程的入口點傳入。內部類是做這件事的好方法。

這可能是有道理的(特別是在這個簡短的例子中)用匿名類來做到這一點。你可以重寫你的循環是這樣的:

for(int i=0;i<2;i++){ 
    Thread ts = new Thread(new Runnable() { 
     public void run() { 
      for(int i = 0; i < 10; i++) inc(); 
     }  
    ); 

    ts.start(); 
    ts= new Thread(new Runnable() { 
     public void run() { 
      for(int i = 0; i < 10; i++) dec(); 
     }  
    ); 
    ts.start(); 
} 
0

當您嘗試使用非內部類發生了什麼?你試圖通過避免內部課堂來解決什麼困難?

您可以轉換爲非內部類;你只需要將TestThread3的實例傳遞給每個對象。

+0

如何將TestThread3的實例傳遞給每個對象?我很困惑。你能告訴我代碼嗎? – Ron

相關問題