在Java中使用线程时是否需要runnable的替代方案

在Java中使用线程时是否需要runnable的替代方案,java,multithreading,runnable,Java,Multithreading,Runnable,从我的主程序调用thread.start()时,方法run()在线程中被调用,如下所示: public class ServerThread implements Runnable { public void run() { //executable code } public void myMethod() { //code to hopefully respond to a button press in m

从我的主程序调用
thread.start()
时,方法
run()
在线程中被调用,如下所示:

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
是不可能的。还有其他方法吗?

修改您的类:

public class ServerThread implements Runnable, ActionListener {

        public void run() {
        //executable code


        }

        void buttonPressed(ActionEvent ae){

      // your event handling code
    }

}
将、
ActionListener
buttonPressed()
更改为特定于框架的侦听器类和事件处理程序。

这应该可以:

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

为什么不能在主类中将对象引用为
ServerThread
?这还不清楚为什么run和myMethod是两种不同的方法。但无论如何,如果需要的话,可以在run中调用myMethod。或者你需要一些完全不同的东西,但是你必须提供更多的信息来获得帮助。我也看不出你为什么不能从任何线程访问该方法,只要你有一个对你创建的ServerThread对象的引用。从另一个线程(可能是修改某个线程状态)调用正在运行的线程上的方法看起来确实是一个薄弱的设计。看看不同的设计可能是个好主意。如果myMethod是在按钮按下时被调用的,它将由GUI线程执行,而不是由服务器线程执行。一旦您同时执行同一对象的两个方法,就会存在竞争条件的严重危险。您需要使用一些安全的线程间通信方法。例如监视器、集合点、信号灯等。我不认为这是特别弱的——这是相当常见的。MyMethod()可能会将其参数排队到运行()等待的专用队列。这意味着线程间通信,正如@TheodoreNorvell所描述的,但这肯定不是一个不同寻常的设计-它很好地封装了线程间通信。只有在使用了正确的同步方法(即同步方法、关键部分或更复杂的锁、信号量等)时,这才有效。问题说明:“我需要从主类调用现有线程中的myMethod。“这足以满足这种需要。@Dave-是的,所以+1。如果OP在myMethod中通过不适当的操作扰乱了线程状态,它不会使您的答案无效。st需要是可访问的。这是否意味着全局性取决于您:)但当我的所有其他按钮和侦听器都放在主程序中时,这会起作用吗?是的,事件将通知所有注册的侦听器