2012-10-22 63 views
0

好了,所以現在我有基本的代碼:呼叫class.method需要一個參數

class a { 

public void ab() { 
    b thread = new b(); 
    thread.bb(this); 
    } 
} 

class b { 

    public void bb(a _a) { 
    //execute code here in new thread so ab can continue running 
    } 
} 

然而,這並不在一個新的線程中打開它,是我沒有研究這個,我發現所有的解決方案沒有留下任何選項發送參數(這)到bb方法

如何在需要參數的新線程中調用class.method?

+0

你確實研究過什麼?,通過這個http://docs.oracle.com/javase/tutorial/essential/concurrency/ – invariant

回答

1

啓動一個線程,你必須有java.lang.Thread一個實例,其中b不是。你可以擴展線程來實現這一點。

class b extends Thread { 

,線程異步運行任何你在run()方法,你可以從原來的(空)實現覆蓋的地方。

class b extends Thread { 

    @Override 
    public void run() { 
    } 
} 

但是,這不允許您傳遞a的實例。這裏最好的選擇是在b的構造函數中將a的實例作爲實例變量。

class b extends Thread { 

    private final a _a; 

    public b(a _a) { 
     this._a = _a; 
    } 

    @Override 
    public void run() { 
     //now you can use _a here 
    } 
} 

最後,異步運行的線程,你不叫新實施的run()方法,但是你叫Thread#start(),它會調用一個新的線程run()方法。

class a { 

    public void ab() { 
     b thread = new b(this); 
     thread.start(); 
    } 
} 

作爲一個側面說明,標準Java約定是開始以大寫字母類名,所以你應該重新命名aA等等。然而,就編譯或執行而言,這不會有什麼區別。

+0

好吧,我的第一個問題是我嘗試了所有這些,當我這樣做時,thread.start()只是一個錯誤,表示start不存在。第二個問題是不是創建一個新的實例?我需要已經運行的特定實例,因爲它是gui –

+0

爲了使'start'存在,您需要在'class b'中擴展Thread。 *不會創建'a'的新實例,因爲封閉的'this'作爲參數傳遞。 – Vulcan

+0

感謝您的幫助,但忘記了java,它是一種語言的笑話。 –

2

問題是「如何在需要參數的新線程中調用class.method?」

答案是「你不能」......但是,這是一個解決方法:使用具有構造函數的實例來定義執行的「上下文」。

class MyThread extends Thread { 
    MyThread(A a){ 
     this.a = a; 
    } 
    @Override public void run() { 
     ... use this.a; // a was the "parameter" 
    } 
    private A a; 
} 

MyThread myThread = new MyThread(aValue); 
myThread.start(); 
+0

MyThread顯然需要一個在這裏聲明的返回類型? –

+0

我已經將行分割爲更加明確:構造函數調用 – Aubin