2017-10-15 160 views
1

我刚开始使用Java的多线程概念。我写了一个小的Java程序,但是,我真的不能理解它的行为。Java多线程thread.sleep()

public class Mythread implements Runnable{ 

    @Override 
    public void run() { 
     System.out.println("mythread: "); 
     Thread t=new Thread(this,"thread1"); 

     for(int i=1;i<5;i++) 
     { 
      System.out.println("in for of myThread"); 

      try { 
       t.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 

} 


public class ThreadTest { 

    public static void main(String[] args) { 
     System.out.println("in main thread"); 
     Mythread mythread=new Mythread(); 
     Thread thread=new Thread(mythread,"thread0"); 
     thread.start(); 

     for(int i=1;i<5;i++) 
     { 
      System.out.println("main class: "+i); 
      try { 
       Thread.currentThread().sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

现在,当我执行上述程序时,我看到当thread1进入休眠状态时thread0也进入休眠状态。

t.sleep(1000); 

thread1thread0相同的线程? 另外,我还没有开始thread1我的代码中的任何地方,那么为什么线程进入睡眠?

我只是一个初学者多线程,并参考Java完整的参考书。

+3

[Thread.sleep](http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#sleep-long-)是一种静态方法。无论你在哪里调用它,它都可以让任何线程调用它。这是Java的怪癖,你可以在非静态的上下文中调用它,而不会造成编译错误。 – Powerlord

回答

1

Thread.sleep(...)方法会导致当前线程进入休眠状态,它是一个静态方法,而不是一个实例。方法

有一个线程,迫使另一个线程睡眠没有安全的方式


您也使对方失误:

  1. 创建Thread的子类通常是一个错误。建议使用线程的方法是编写一个实现Runnable的类,并创建java.lang.Thread的实例作为您的线程。更好的是,使用线程池,fork-join池或ExecutorService实例。

  2. 在此:

    Mythread mythread = new Mythread(); 
    Thread thread = new Thread(mythread, "thread0"); 
    

    你实际上是使用mythread对象为(只)一Runnable

  3. 您在run()方法中创建的线程从不使用......因为您从不启动它们。但是如果你这样做了,就会出现线程爆炸......因为你用this作为Runnable来实例化它们,而run()方法只是创建更多的线程。

  4. 有一些Java风格的违规行为......从您选择的Mythread作为类名开始。


回答您的问题:

是线程1和thread0指的是同一个线程?

此外,我还没有在我的代码的任何地方开始线程1那么为什么线程进入睡眠状态?

实际上,它正在睡觉。如果更改

System.out.println("in for of myThread"); 

System.out.println("in for of myThread: " + Thread.currentThread()); 

你会看到...

0

Thread.sleep是一个类方法,而不是一个实例方法。实际上你打电话给Tread.sleep(1000),这是线程类上的请求让当前正在执行的线程休眠。

虽然thread1thread2不是相同的线程,每个线程请求休眠1秒。

btw。任何好的IDE都会告诉你'静态方法sleep(long)应该以静态方式访问Thread类型“

0

没有,thread0thread1是不一样的线程。正如在前面的答案中所说的,睡眠方法是静态的,它会使当前线程进入睡眠状态。由于thread1从来没有进入可运行状态,因此它没有进入睡眠状态的概念,它是你的睡眠状态的thread0。 有关这方面的进一步参考,您可以参考here以获得关于线程状态的流程以及从另一个线程创建新线程的清晰见解。