Java多线程thread.sleep()

时间:2017-10-15 11:02:10

标签: java multithreading

我刚开始使用Java的多线程概念。我写了一个小的Java程序但是,我真的无法理解它的行为。

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 The Complete参考书。

3 个答案:

答案 0 :(得分:3)

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作为类名开始。

  5. 回答你的问题:

      

    是thread1,thread0是指同一个线程吗?

    没有

      

    此外,我还没有在我的代码中的任何地方启动thread1,那么为什么线程会进入睡眠状态呢?

    事实上,正在睡觉的是thread0。如果你改变了

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

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

答案 1 :(得分:0)

Thread.sleep是一个类方法,而不是实例方法。实际上,您正在调用Tread.sleep(1000),这是对线程类的请求,以使当前正在执行的线程处于休眠状态。

因此尽管thread1thread2不是同一个线程,但每个线程请求休眠1秒钟。

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

答案 2 :(得分:0)

不,WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARBthread0不是同一个帖子。如前面的答案中所述,sleep方法是静态的,它会将当前线程置于休眠状态。由于thread1从未进入可运行状态,因此没有进入睡眠状态的概念,这是你的thread0将要进入休眠状态。 有关此问题的进一步参考,您可以参考here以获得有关线程状态流和从另一个线程创建新线程的清晰见解。