启动线程时出现问题

时间:2011-01-07 14:00:17

标签: java multithreading

我正在使用Java而我正在尝试下面的代码

public RunnableThread(String threadName){

     thread = new Thread(this,threadName);
     System.out.println(thread.getName());
     thread.start();
     boolean status=thread.isAlive();
}

但是当我检查线程的状态时,它返回我的错误。

我没有得到可能是什么问题。

提前感谢您的建议。

实际上我的run()方法有很多代码要执行。

我的main()方法在下面的部分代码中有一部分     JumboScrapeThread jumbThread = new JumbocrapeThread(“jubmThread”);     线程刮刀=新线程(jumbThread,“刮刀”);         scraper.start();

正如我们所知,当我们调用thread.start()时,它在内部调用run()方法。 但是我在启动线程时遇到了问题,所以我的run()方法没有被调用。

我正在使用与sellinium的线程,所以有可能因为它而遇到问题吗?

5 个答案:

答案 0 :(得分:2)

可能是一个经典的竞争条件:只调用start() 开始创建并最终运行新线程的过程,并且在该进程到达之前调用isAlive()线程被正式视为“已启动”的阶段(或者,可能在其完成运行之后)。

答案 1 :(得分:1)

一旦run()方法结束,线程就会结束,因此在调用isAlive()方法时线程的状态可能会为'false',尽管JVM不保证这(所谓的竞争条件,无论它是返回真还是假)。你应该在run方法中加入一些东西。

答案 2 :(得分:1)

这是因为Thread需要Runnable或Thread作为输入,我不确定RunnableThread的类型是否已覆盖run()方法。

如果它为空,则线程将完成执行,在这种情况下,alive返回false。

答案 3 :(得分:0)

可能是因为在你致电isAlive()之前线程已经开始并完成了。除非您进行显式同步,否则JVM不保证执行线程的顺序。

答案 4 :(得分:0)

您可以使用同步来等待线程完全启动。

<强>代码

public class Main {

    static class RunnableThread implements Runnable {

        private Thread thread;
        private Object waitForStart = new Object();

        public RunnableThread(String threadName) {

            thread = new Thread(this, threadName);
            System.out.println(thread.getName());


            synchronized (waitForStart) {
                thread.start();
                try {
                    waitForStart.wait();
                } catch (InterruptedException ex) {
                }
                boolean status = thread.isAlive();
                System.out.println(status);
            }
        }

        public void run() {

            synchronized (waitForStart) {
                waitForStart.notifyAll();
            }

            // Do a bunch of stuff
            try {
                Thread.sleep(4000);
            } catch (InterruptedException ex) {
            }

            System.out.println("Thread finished.");
        }
    }

    public static void main(String[] args) {
        RunnableThread thread = new RunnableThread("MyThread");
    }
}