Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使另一个线程休眠_Java_Multithreading - Fatal编程技术网

如何在Java中使另一个线程休眠

如何在Java中使另一个线程休眠,java,multithreading,Java,Multithreading,我有一个扩展线程的类。这个线程在运行时大部分时间都在休眠,它将执行一个检查,如果为true,则执行一个简单的操作,然后休眠1/2秒并重复 该类还有一个由其他线程调用的公共方法。如果这是所谓的我希望线程睡眠时间更长,如果它已经睡眠或只是睡眠立即如果它没有。我尝试使用this.sleep,但它似乎仍然使当前线程处于休眠状态,并且它抱怨sleep方法是静态的,应该是静态访问的 这个程序显示了我的问题,当CauseSleep被调用时,我希望它停止打印数字,直到睡眠结束 public class Slee

我有一个扩展线程的类。这个线程在运行时大部分时间都在休眠,它将执行一个检查,如果为true,则执行一个简单的操作,然后休眠1/2秒并重复

该类还有一个由其他线程调用的公共方法。如果这是所谓的我希望线程睡眠时间更长,如果它已经睡眠或只是睡眠立即如果它没有。我尝试使用this.sleep,但它似乎仍然使当前线程处于休眠状态,并且它抱怨sleep方法是静态的,应该是静态访问的

这个程序显示了我的问题,当CauseSleep被调用时,我希望它停止打印数字,直到睡眠结束

public class Sleeper {
    public static void main(String[] args) {
        new Sleeper();
    }
    public Sleeper() {
        System.out.println("Creating T");
        T t = new T();
        System.out.println("Causing sleep");
        t.CauseSleep();
        System.out.println("Sleep caused");
    }
    public class T extends Thread {
        public T() {
            this.start();
        }
        public void run() {
            for (int i = 0; i < 30; i++) {
                System.out.println("T Thread: " + i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                }
            }
        }
        public void CauseSleep() {
            try {
                this.sleep(2000);
            } catch (InterruptedException e) {
            }
        }
    }
}

你再也睡不着了。(您可以使用不推荐使用的
suspend()
方法,但请不要使用)。此电话:

this.sleep(200);
将实际使当前正在执行的线程休眠,而不是“this”所指的
线程<代码>睡眠
是一种静态方法-好的IDE将在该行上发出警告

你应该有一个标志,上面写着“请睡觉”,然后让睡眠线程在做任何工作之前检查这个标志


这是一件好事,你不能导致另一个线程睡眠。假设它是在一个同步的方法中——这意味着您在睡觉时持有一个锁,导致其他所有试图获取相同锁的人都被阻塞。这不是一件好事。通过使用基于标志的系统,你可以以一种可控的方式进入睡眠状态——在一个你知道它不会造成伤害的点上。

事实上,为了让线程睡得更久,我建议你的特殊方法将这一事实记忆到一个不稳定的字段中。然后,感兴趣的线程应该读取该变量,如果设置了,则睡眠时间更长

现在,要使它立即睡眠,必须中断线程。这将引发异常,以停止当前处理。现在你必须处理这个。。。想想这是否真的是你想要的


另一种解决方案是,在线程normal的活动中,也像第一种情况一样轮询变量,如果设置了,则休眠。这不会导致立即睡眠,但可能会非常快,并且中断会发生在代码中的特殊点,您知道可以在不中断的情况下停止…

将此添加到线程中:

public AtomicBoolean waitLonger = new AtomicBoolean  ();
public Object lock = new Object ();
run()
中:

在另一个线程中:

synchronized (lock) {
try {
    sleeper.waitLonger.set(true);
    ...
    lock.notify();
    sleeper.waitLonger.set(false);
}
这样,您可以让卧铺等待其他工作完成

synchronized (lock) {
    if (waitLonger.get ()) {
        lock.wait ();
    }
}
synchronized (lock) {
try {
    sleeper.waitLonger.set(true);
    ...
    lock.notify();
    sleeper.waitLonger.set(false);
}