2013-02-28 43 views
1

使用線程時,當調用從我的主程序thread.start()方法run()被稱爲線程像這樣來運行的:我需要一個替代Java中

public class ServerThread implements Runnable { 

     public void run() { 
     //executable code 
     } 

     public void myMethod() { 
     //code to hopefully respond to a button press in main class. 
     } 
} 

我需要調用myMethod從現有線程我的主班。但據我所知,這是不可能的,使用Runnable。有其他方法可以做到嗎?

+7

爲什麼不能引用對象爲在主類'ServerThread'? – Perception 2013-02-28 12:13:20

+0

這並不清楚爲什麼run和myMethod是兩種不同的方法。但無論如何,如果這是您需要的,您可以在運行中調用myMethod。或者,也許你需要完全不同的東西,但是你會有更多的信息來獲得一些幫助。 – 2013-02-28 12:20:02

+1

我也看不出有什麼理由不能從任何線程訪問該方法,只要你有一個對你創建的ServerThread對象的引用即可。它似乎是一個弱設計,從另一個線程調用正在運行的線程的方法(可能會修改某個線程狀態)。看看不同的設計可能是個好主意。 – RudolphEst 2013-02-28 12:22:17

回答

3

這應該工作:

ServerThread st = new ServerThread(); 
new Thread(st).start(); 
st.myMethod(); 
+0

只有在使用適當的同步,即同步方法,臨界區或更復雜的鎖,信號量等時,這纔會起作用。 – Gunnarr 2013-02-28 12:52:00

+0

問題指出:「我需要在現有的方法中調用myMethod來自我主班的線程。「這足以滿足這種需求。 – Dave 2013-02-28 13:20:39

+0

@Dave - 是的,所以+1。如果OP在myMethod中通過不恰當的操作來調整線程狀態,它不會使您的答案失效。 – 2013-02-28 13:30:42

0

修改類:

public class ServerThread implements Runnable, ActionListener { 

     public void run() { 
     //executable code 


     } 

     void buttonPressed(ActionEvent ae){ 

     // your event handling code 
    } 

} 

變化,ActionListenerbuttonPressed()您框架的具體Listener類和事件處理程序。

+0

但是,當我的所有其他按鈕和聽衆都放在我的主程序中時,這種方式是否可行? – Chucky 2013-02-28 13:22:58

+0

是的,事件將被通知給所有註冊的聽衆 – TheWhiteRabbit 2013-03-01 05:57:18