Java Thread sleep方法的行为不符合预期

时间:2014-03-17 14:13:07

标签: java multithreading

我想在我的propram上睡一个线程,但它让两个线程睡觉,所以我的问题是什么,请帮帮忙?

public class TestWait extends Thread{
    static TestWait t1;
    static TestWait t2;



    public void run()
    {
        while(true)
        {
            try {
                t1.sleep(10000);
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

        }
    }

    public static void main(String [] args) throws InterruptedException
    {
        t1 = new TestWait();
        t2 = new TestWait();

        t1.start();
        t2.start();

        t1.setName("t1");
        t2.setName("t2");
    }

}

4 个答案:

答案 0 :(得分:2)

Thread.sleepstatic方法,它使调用它的线程休眠毫秒数。你的代码

t1.sleep(10000);

实际上与

相同
Thread.sleep(10000);

答案 1 :(得分:1)

该方法将"当前正在执行的线程置于休眠状态"。它不应该以这种方式对实例进行调用。 http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#sleep%28long%29

答案 2 :(得分:0)

我确定您在t1.sleep()中有警告:

Thread.sleep(int)暂停当前威胁,因此当两个对象共享run()实现时,它们都会暂停。您可以更改它并执行以下操作:

public class TestWait extends Thread{
    static TestWait t1;
    static TestWait t2;

    private boolean flag

    public TestWait(boolean wait) {
         this.flag=wait;
    }

    public void run() {


     while(true) {
            try {
                if (flag) {
                    Thread.sleep(10000);
                }
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

        }
    }

    public static void main(String [] args) throws InterruptedException {
        t1 = new TestWait(true);
        t2 = new TestWait(false);

        t1.start();
        t2.start();

        t1.setName("t1");
        t2.setName("t2");
    }

}

答案 3 :(得分:0)

在Java中,您可以使用对类实例的引用来调用静态方法,即使此引用是null ...如果类s中有静态方法A ,然后所有这些工作:

final A a = new A();
final A nullA = null;

A.s(); // via class
a.s(); // via non null reference
nullA.s(); // via null reference

Thread.sleep() is static

为了避免混淆,请不要使用此方法,而是使用TimeUnit代替:

TimeUnit.SECONDS.sleep(10);