java线程未超出范围
让我尽可能多地解释这个问题。我有一个主类,从这个主类,我创建了一个套接字读写器。然后我创建一个读卡器“runnable”,并使用threadmanager启动线程java线程未超出范围,java,multithreading,sockets,Java,Multithreading,Sockets,让我尽可能多地解释这个问题。我有一个主类,从这个主类,我创建了一个套接字读写器。然后我创建一个读卡器“runnable”,并使用threadmanager启动线程 // MainApp.java public class MainApp{ public static void main (String[] args){ MainApp app = new MainApp();
// MainApp.java
public class MainApp{
public static void main (String[] args){
MainApp app = new MainApp();
app.setUpNetworking();
}
public void setUpNetworking(){
try{// try socket conn
ThreadManager();
}catch{ //catch errors}}
public void ThreadManager(){
Thread t1 = new Thread(new ProcessMessage());
t1.start();}
public class ProcessMessage implements Runnable{
public void run() {
String message;// TODO Auto-generated method stub
try{
while((message=reader.readLine()) != null){
// read line from buffer
System.out.println(message)"
HandleMessage(message);
}
} catch{}
}}
public void HandleMessage(String message){System.out.println(message);}
public void LoadGUI(){//load GUI, menubar, etc.
menuBarSubItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev){
AdditionalFunction d = new AdditionalFunction(reader,writer);
}
});}
}
到目前为止一切正常。现在在LoadGUI中,我创建了一个Jframe,加载并添加了一个jmenubar,还添加了一些菜单栏项。我为菜单栏项创建了一个actionlistener,我用它来加载另一个类,所以基本上,单击菜单栏项,一个新的jframe加载AdditionalFunctionreader,writer
// AdditionalFunction.java
public class AdditionalFunction {
public AdditionalFunction(BufferedReader reader, PrintWriter writer){
ThreadManager();
}
public void ThreadManager(){
Thread t1 = new Thread(new ProcessDifferentMessage());
t1.start();
}
public class ProcessDifferentMessage implements Runnable{
public void run(){
String message;
try{
while((message=r.readLine()) != null){
System.out.println(message);
HandleDifferentMessage();
}
} catch(Exception ex){ex.printStackTrace();}
}
}
}
在这个新框架中,调用AdditionalFunction.java,我将传递在Main类中创建的BufferedReader和writer
然后,我创建了一个threadmanager,并尝试运行一个线程,从新的frameie中调用它ProcessDifferentMessage。AdditionalFunction.java,与我在原始主应用程序中所做的非常相似
所以在这一点上,我应该有两个线程在运行。。一个只关注读取ProcessMessage,另一个关注ProcessDifferentMessage
ProcessMessage在打开AdditionalFunction.java.之前可以正常激发。。但是在通过单击菜单栏项启动AdditionalFunction.java之后,当我尝试通过套接字发送消息时,该套接字只会触发ProcessDifferentMessage。。它不点火,再发一次它点火,再发一次它不点火
当我关闭第二个Jframe并发送应该触发ProcessDifferentitMessage的消息时,相同的行为有时会触发,但在其他时间不会触发。但在这一点上,我甚至不想让这一步触发ProcessDifferention消息,因为我关闭了AdditionalFunction.java框架
简而言之:我有一个main类,它创建了一个线程,并给它一个incomingmessagereader runnable。这个主类也有GUI,某些菜单项会触发新的Jframes。ie.AdditionalFunction.java,它扩展了JFrame。我将在main类中创建的读写器从main类传递到AdditionalFunction构造函数。我从additionalFunction.java创建了一个新线程,并为它提供了另一个incomingmessagereader可运行的不同实现和方法。但我希望第二个incomingmessagereader runnable在我关闭其原始jframe ie时停止从套接字读取行。对于第二个incomingmessagereader runnable,它将是additionalfunction.java。。但即使在我关闭第二个jframe。。线程仍处于活动状态,正在读取消息
为什么第二个线程没有超出范围?
关闭第二个窗口后如何强制处置?我尝试了windowevent/adapter并销毁了第二个线程。。没用
“超出范围”是一个错误的术语。变量超出范围。线程退出,它们通过离开run方法来退出,除非它们是守护进程线程,否则不会以其他方式退出。这可能是您困惑的根源。您是否在关闭JFrame时关闭了套接字?我在关闭MainApp主JFrame时关闭了套接字