不进入线程方法

时间:2016-03-16 18:26:13

标签: java multithreading

我正在网上编写代码来创建聊天应用程序。在解决了我的程序问题以找出它无法正常工作的原因之后我发现我的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 个答案:

答案 0 :(得分:4)

start()上拨打Thread即可:

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对象没有多少理由。

答案 1 :(得分:0)

当然,使用适当的Execotor甚至更好的ExecutorService是处理线程的更合适的方法。阅读它here。但是如果你坚持以旧的方式工作,那么你需要调用线程的start()方法。方法start()run()执行相同的操作,只有run()顺序执行您的线程,即在您调用它的同一个线程中,start()实际上启动了一个新线程,您的代码执行这是你想要的第一个