在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需要是可访问的。这是否意味着全局性取决于您:)但当我的所有其他按钮和侦听器都放在主程序中时,这会起作用吗?是的,事件将通知所有注册的侦听器