有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java未进入线程方法

我正在在线编写代码来创建聊天应用程序。在对我的程序进行故障排除以找出它不工作的原因后,我发现这里的run方法中的代码没有被访问。下面是代码片段

public void listen()
{
    listen = new Thread("Listen") {
        public void run()
        {
            writeMessage("Working in here");
            while (true) {
                String message = client.receive();
                if (message.startsWith("/c/")) {
                    client.setID(Integer.parseInt(message.substring(3, message.length())));
                    writeMessage("Successfully connected to server" + client.getID());
                }
            }
        }
    };
}

它正在到达listen方法本身,因为如果我在声明线程之前使用write message命令,它会为我打印消息,看看这个,你知道为什么它不会再输入了吗

谢谢


共 (2) 个答案

  1. # 1 楼答案

    当然,使用合适的Executor或更好的ExecutorService是当今处理线程更合适的方式。读一下here。但是,如果您坚持使用旧方法,那么您需要调用线程的start()方法。方法start()run()做同样的事情,只有run()顺序执行线程,即在调用它的同一个线程中,并且start()实际上启动一个新线程,在那里执行代码,这是您首先想要的

  2. # 2 楼答案

    Thread上调用start()可以:

    public void listen()
    {
        listen = new Thread("Listen") {
            public void run()
            {
                writeMessage("Working in here");
                while (true) {
                    String message = client.receive();
                    if (message.startsWith("/c/")) {
                        client.setID(Integer.parseInt(message.substring(3, message.length())));
                        writeMessage("Successfully connected to server" + client.getID());
                    }
                }
            }
        };
        listen.start(); // <  Add this line
    }
    

    此外,您通常不想扩展Thread(这里使用的是匿名类)。通常,您需要创建一个Runnable,并将其传递给Thread的构造函数:

    Runnable r = new Runnable() {
        @Override
        public void run()
        {
            // Do some work here
        }
    };
    
    Thread listen = new Thread(r, "Listen");
    listen.start();
    

    或者更好的方法是使用Executor,没有太多好的理由创建自己的Thread对象