【问题标题】:java GUI multi-threading with socketjava GUI 多线程与套接字
【发布时间】:2015-04-09 05:00:33
【问题描述】:

我正在尝试制作一个从 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. 套接字接收

    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;        
    }
    

}

【问题讨论】:

  • 2.框架,我只附上了菜单动作部分。如果您需要完整代码,请告诉我
  • “我知道我必须使用 EDT,我尝试过但没有用。” - 不,这实际上是相反的,你不想在 EDT 中执行长时间运行或阻塞的呼叫(例如与 Socket 交谈)
  • @MadProgrammer 是的,所以我想通过使用 GUI 事件来停止套接字,但在我的 GUI 上没有任何工作。它完全冻结了
  • 那是因为你在 EDT 中打开了 Socket...
  • 使用SwingWorker 进行套接字工作。

标签: java multithreading swing sockets


【解决方案1】:
info = new getInfo(40000);//open socket
info.run();

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

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

参见:Java Puzzlers: Traps, Pitfalls, and Corner Cases 作者 Joshua Bloch 和 Neal Gafter,Puzzle #76

【讨论】:

    【解决方案2】:

    我编写了一个名为 Jexxus 的库,它可以让您更轻松地使用套接字。它会自动在不同的线程上执行操作,因此您的 UI 不会冻结。页面底部有一个小教程:https://github.com/mirraj2/Jexxus/tree/master

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-19
      • 2020-03-28
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多