java GUI 多线程与套接字

标签 java multithreading swing sockets

我正在尝试制作一个从 TCP 套接字获取数据的 GUI 程序。 问题是当我设置套接字然后启动它时,GUI 程序卡住。 我想添加一个通过使用单击事件来停止线程的函数。

据我所知我必须使用 EDT,我尝试过但不起作用。有谁可以帮助我吗?

这是我的代码。

  1. 主要内容

    public class ImageSplit {  
    static ImageViewerFrame program;
    public static void main(String[] args) throws IOException {  
    JPanel[] displayArray = new JPanel[100];   
    program = new ImageViewerFrame();
    
    EventQueue.invokeLater(new Runnable(){
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            program.setVisible(true);
        }
    
    });
    } 
    
  2. 框架

    void createMouseMenu() {
    final PopupMenu menu = new PopupMenu();
    MenuItem grid = new MenuItem("Grid");
    MenuItem start = new MenuItem("Start");
    MenuItem stop = new MenuItem("Stop");
    menu.add(grid);
    menu.add(start);
    menu.add(stop);
    add(menu);
    
    mouseMenuHandler mousemenu = new mouseMenuHandler();
    
    grid.addActionListener(mousemenu);
    start.addActionListener(mousemenu);
    stop.addActionListener(mousemenu);
    
    addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            if (e.getModifiers() == InputEvent.BUTTON3_MASK)
                menu.show(e.getComponent(), e.getX(), e.getY());
        }
    });
       }
    class mouseMenuHandler implements ActionListener {
    getInfo info;
    
    public void actionPerformed(ActionEvent e) {// open grid setting
        if (e.getActionCommand().equals("Grid")) {
            gridSettingUI = new GridSetting(img);
            gridSettingUI.setVisible(true);
        } else if (e.getActionCommand().equals("Start")) {
            try {
                info = new getInfo(40000);//open socket
                info.run();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        } else if (e.getActionCommand().equals("Stop")) {
            System.out.println("stop");
            info.stop();
        }
    }
    }
    
  3. socket接收

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    
    
    public class getInfo implements Runnable{
    ServerSocket serverSocket;
    private boolean stopped=false;
    
    public getInfo(int port_num) throws IOException{
    serverSocket = new ServerSocket(port_num);
    }
    @Override
    public void run() {
    // TODO Auto-generated method stub
    while(!stopped){
    try {
    Socket socket = serverSocket.accept();
    System.out.println(socket.getInetAddress()+ "connected");
    
    InputStream is = socket.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    if(br.ready())
    {
    String line = br.readLine();
    System.out.println(line+"\n");
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    }
    
    public void stop(){
    stopped = true;        
    }
    

}

最佳答案

info = new getInfo(40000);//open socket
info.run();

在上面的行中,您没有启动一个线程,相反,您只是在同一线程中执行run()方法(就像任何其他方法调用一样)。

Thread扩展,然后调用info.start()

请参阅:Java 谜题:陷阱、陷阱和极端情况,作者:Joshua Bloch 和 Neal Gafter,Puzzle #76 .

关于java GUI 多线程与套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29530127/

相关文章:

java - 打开新 JFrame 时如何禁用主 JFrame

java - 在 Web 应用程序中绘制图形

java - 在 java 中用循环显示行

java - 如何在 ANTLR 重写中携带节点的子节点?

multithreading - 在指定时间唤醒线程

c# - 如何启动一个停止的线程

java - 我应该关闭 org.apache.commons.io.IOUtils 的 InputStream

java - SwingWorker线程同步

Java JTableHeader 样式

java - 如何强制事件监听器在 java 中最后执行?