java - 线程的简单问题

标签 java multithreading sockets tcp

我想做的就是启动一个线程来监听某个端口上的通信。

我通过 jDialog 上的“确定”按钮开始此操作。单击“确定”后,jDialog 应该隐藏自身 (HostClientDialog.setVisible(false);),当线程起始行不在其中时,该功能会起作用。

try {

            HostClientDialog.setVisible(false);

            // start a thread that listens for incoming messages
            new gameCycle().start();

} catch (Exception e) { }

new gameCycle().start(); 行正在调用以下代码:

public class gameCycle extends Thread {

    //public gameCycle(){
      //  super();
    //}

    @Override
    public void run() {

        try {

            ServerSocket connection = new ServerSocket(4242);

            // Wait for connection
            Socket s = connection.accept();

            // Socket input
            BufferedReader in = new BufferedReader(new
                    InputStreamReader(s.getInputStream()));

            // for receiving moves
            while (true) {

                String message = "";

                message = in.readLine();

                if (message != null && !message.equals("")) {
                    // do something with message
                }

                sleep(100);

            } // end while

        } catch (Exception e) { }

    } // end run
} // end class

我理解上面的代码是循环的,直到收到消息,然后对消息执行某些操作。但是,当您执行此代码时,会再次(立即)创建 jDialog 框并重新提示用户单击“确定”。它不会让用户通过 jDialog 框,它只会不断地重新提示他们。

我对线程相当陌生(除了使用多线程打印之外,我没有做更多的事情),所以我觉得我可能错误地实现了它。但我四处寻找例子,它们似乎或多或少是我所拥有的。

编辑(美国东部时间 2010 年 11 月 29 日凌晨 1:30)

看来我对TCP通信的理解并不像我想象的那么好。我的线程和后续 while 循环的目标如下:

  • 程序会在后台 正在等待发送的任何消息 方式
  • 如果它收到一条消息,它会更新 GUI 上的某些内容,然后返回等待更多消息

始终允许用户持续使用 GUI。

最佳答案

我想说您提供的代码对我来说看起来不错。

我将实现取消整个线程的可能性,而不是使用 while(true) 循环。 请改用 boolean 值,并使其他线程可以访问该 boolean 值。如果您需要这方面的帮助,请回来找我。

我认为问题出在我们在这里看不到的代码上。 我对线程上 .start() 调用周围的代码片段部分感兴趣。之后会发生什么?

干杯

编辑:

 public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    final JDialog dia = new JDialog();
    JButton btn = new JButton("Foo");
    btn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            dia.setVisible(false);
            Runnable t = new Runnable() {
                public void run() {
                    System.out.println("foo");
                }
            };
            t.run();
        }
    });
    dia.getContentPane().add(btn);
    dia.setSize(500, 400);
    dia.setVisible(true);
}
}

这对我来说非常有效 - 抱歉,但我无法重现您在评论中所述的错误。请考虑提供更多代码:)

编辑#2: 不要直接在线程内设置任何变量。相反,请使用观察者-监听者模式。当有新消息传入时,让线程触发 propertyChangeEvent。 http://download.oracle.com/javase/1.4.2/docs/api/java/beans/PropertyChangeListener.html

也许您应该尝试实现一些更琐碎的事情..首先进行快速轻松的聊天。 http://www.ashishmyles.com/tutorials/tcpchat/index.html

当你记下这些之后,请考虑一下你的 future 项目。也许阅读有关 swing 的多线程可能会有所帮助? http://java.sun.com/developer/technicalArticles/Threads/swing/

关于java - 线程的简单问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4301056/

相关文章:

java - Ant 中属性的默认值

java - itext:itext 5.4.3如何处理?

php - 在 PHP 扩展中从线程使用 emalloc 时出现段错误

c# - 在一个Producer和Multi-Consumer实现中等待所有Consumer都处于waiting状态

c - 检查通过程序的 C 管道——边界情况

java - Android Thread getName 给出当前类名

java - Gradle 无法启动您的构建。我不知道发生了什么,但 android studio 显示了这个错误。昨天它不存在,但今天我不知道发生了什么

java - 如何实现多个 'threads'只在一个线程中运行

sockets - 如何与c++库websocket++建立安全套接字连接?

java - 聊天服务器停止工作