2013-10-22 40 views
-2

我有这样的代码(完整的源代码): -Java线程不睡觉

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秒。但是,线程根本没有睡觉。我哪里错了。任何帮助将不胜感激。

编辑 我得到现在出现以下错误 - >

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

你没有启动线程......另外,'sleep'是一个'static'方法。 –

+1

谁调用你的“主要”方法,这不是公共静态void main – RamonBoza

+0

我正在做这个程序在blueJ和我正在运行的主要方法@RamonBoza – h2O

回答

7

这里的根本问题是,你永远不会启动线程。您的程序的main被称为默认线程,您创建的一个实例,然后不做任何事情。

如果你想开始你的线程,请致电t.start()(一次)。这将启动您的线程,该线程将与JVM在运行程序时创建的默认线程一起运行。除了这两个线程同时运行外,它们不会在您的程序中进行交互,所以您仍然会看到数字会立即打印出来。根据您要做的事情,您可能需要将您的循环从main移至run

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

所以例如,这里是你的班,只有最小的mods(note:你的环境似乎创建了一个实例并调用下面的实例特定的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的循环移至run,调用sleep后。
  • 使i成为run的局部变量。
  • 通过Thread而非this拨打电话sleep

下面是一个比较正常的例子有静态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

+0

完美答案,的确如此 – h2O

+0

你的代码不会等待1秒......我所做的是在循环中(**在主要方法**中),我把这个 - >'run();'它起作用! – h2O

+1

@BenLind:你从不直接调用线程或Runnable的'run'方法;它在运行线程时被隐式地称为*。如果直接调用'run',则在当前线程**上执行方法**,而不是新方法。我不知道你对上面的代码意味着什么,不等待一秒钟;它确实如此。证明:http://ideone.com/Iw4p1w –

1

Threadsleep方法是静态的,所以它应该被称为Thread.sleep(),它实际上使得当前执行的线程休眠,而不是您调用该方法的特定线程实例。

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){ 
     } 
    } 
}