Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java线程未超出范围_Java_Multithreading_Sockets - Fatal编程技术网

java线程未超出范围

java线程未超出范围,java,multithreading,sockets,Java,Multithreading,Sockets,让我尽可能多地解释这个问题。我有一个主类,从这个主类,我创建了一个套接字读写器。然后我创建一个读卡器“runnable”,并使用threadmanager启动线程 // MainApp.java public class MainApp{ public static void main (String[] args){ MainApp app = new MainApp();

让我尽可能多地解释这个问题。我有一个主类,从这个主类,我创建了一个套接字读写器。然后我创建一个读卡器“runnable”,并使用threadmanager启动线程

// 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时关闭了套接字