Java线程没有睡觉

时间:2013-10-22 14:10:31

标签: java multithreading

我有这个代码(完整的源代码): -

class thread implements Runnable {
    int i=0;
    Thread t;
    public void main(){
     t= new Thread(this); //edited
        for(i=0;i<=5;i++){
            System.out.println(i);
        }
    }

    public void run(){
        try{
            Thread.sleep(1000); //EDITED EARLIER, was: t.sleep(1000); 
        }
        catch(InterruptedException e){
        }
    }
}

线程应该睡1秒钟。但是,线程根本不会睡觉。我哪里错了。任何帮助将不胜感激。

修改 我现在收到以下错误 - &gt;

java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:682)
at thread.main(thread.java:7)

3 个答案:

答案 0 :(得分:7)

这里的根本问题是你永远不会启动线程。您的程序的main在默认线程上调用,您创建一个实例,然后不执行任何操作。

如果您想启动主题,请致电t.start()(一次)。这将启动您的线程,该线程将与JVM在运行程序时创建的默认线程一起运行。除了两个线程同时运行之外,它们不会在您的程序中进行交互,因此您仍然会看到数字立即打印出来。根据您要执行的操作,您可能希望将循环从main移至run

(是的,sleep是一个静态方法,它使当前线程休眠。在Java中,通过实例引用调用静态方法在语法上是有效的,但它是一个坏的想法。)

例如,这里是你的类有最小mods(注意:你的环境似乎创建了一个实例,并在下面调用特定于实例的main,这是非标准的,但是我把它放在一边,因为它似乎是你的环境所做的事情):

class ThreadExample implements Runnable
{
    public void main(){
        Thread t= new Thread(this);
        t.start();
    }

    public void run(){
        int i;

        try{
            Thread.sleep(1000); 
            for(i=0;i<=5;i++){
                System.out.println(i);
            }
        }
        catch(InterruptedException e){
        }
    }
}

的变化:

  • 为类使用标准Java命名约定。
  • t
  • 中设置main个本地变量
  • 实际上在main
  • 中启动帖子
  • main来电后,将循环从run移至sleep
  • i
  • 中设置run个本地变量
  • 通过sleep而不是Thread致电this

这是一个更常见的静态main示例:

class ThreadExample implements Runnable
{
    public static void main(String[] args) {
        Thread t = new Thread(new ThreadExample());
        t.start();
    }

    public void run(){
        int i;

        try{
            Thread.sleep(1000); 
            for(i=0;i<=5;i++){
                System.out.println(i);
            }
        }
        catch(InterruptedException e){
        }
    }
}

Live example with debug output

答案 1 :(得分:1)

sleep中的Thread方法是静态的,因此它应该被称为Thread.sleep()并且它实际上使当前正在执行的线程处于休眠状态,而不是您调用该方法的特定线程实例上。

答案 2 :(得分:0)

您的代码看起来应该更像这样。自从我使用线程以来已经有一段时间了,所以可能会有一些小错误让人们可以自由编辑。

class myThread implements Runnable
{
    public void main(){
        MyThread t= new MyThread();
        t.start();
        t.join();
    }

    public void run(){
        try{
            for(i=0;i<=5;i++){
                System.out.println(i);
                Thread.sleep(1000); 
            }
        }
        catch(InterruptedException e){
        }
    }
}