如何让正在运行的线程暂停一段时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让正在运行的线程暂停一段时间相关的知识,希望对你有一定的参考价值。

    可以使用Thread类的Sleep()方法让线程暂停一段时间。需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为Runnable,并且根据线程调度,它将得到执行。

    可以使用thread.wait()方法来让线程暂停一段时间,wait方法里面填写的是暂停的时间的长度,一毫秒为单位,

参考技术A 停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以用Thread.stop()方法,但最好不要用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是已被废弃的方法。

在java中有以下3种方法可以终止正在运行的线程:

使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。
使用interrupt方法中断线程。
参考技术B 可以使用Thread类的Sleep()方法让线程暂停一段时间。需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为Runnable,并且根据线程调度,它将得到执行。 可以使用thread.wait()方法来让线程暂停一段时间,wait方法...本回答被提问者采纳

Java线程休眠和线程让步

线程休眠我们希望人为地控制线程,使得正在执行的线程暂停,将CPU让给别的线程,我们可以使用静态方法sleep(long millis),该方法可以让当前正在执行的线程暂停一段时间,进入休眠等待状态

线程让步线程让步可以通过yield() 方法来实现,该方法和sleep()有点相似,都可以让当前正在运行的线程暂停,区别在于yield()方法不会阻塞该线程,他只是将线程转换成就绪状态,让系统调度器重新调度一次。当某个线程调用yield()方法之后,只有与当前线程优先级相同或者更高的线程才能获得执行的机会

线程休眠简单实例

public class ThreadSleep {
    public static void main(String[] args) {
        new Thread(new SleepThread()).start();
        
        for(int i=1;i<=10;i++) {
            if(i == 5) {
                System.out.println("mainThread start sleep!");
                try {
                    Thread.sleep(20000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println("mainThread is inputting:"+i);
            
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
    }
}

class SleepThread implements Runnable {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for (int i = 0; i < 10; i++) {
            if (i == 3) {
                System.out.println("deputyThread start sleep!");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

            System.out.println("deputyThread is inputting:"+i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

}

 

线程让步简单实例

public class ThreadYield {

	public static void main(String[] args) {
		
		new Thread(new YieldThread(),"Thread A").start();
		new Thread(new YieldThread(),"Thread B").start();
		new Thread(new YieldThread(),"Thread C").start();
		new Thread(new YieldThread(),"Thread E").start();
		new Thread(new YieldThread(),"Thread F").start();
		new Thread(new YieldThread(),"Thread G").start();
		new Thread(new YieldThread(),"Thread H").start();
		
	}
		
}

class YieldThread implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i = 0;i <=10;i++) {
			if(i == 4) {
				System.out.println(Thread.currentThread().getName()+" that is inputting "+i+" has yielded!");
				continue;
			}
			System.out.println(Thread.currentThread().getName()+" is inputting :"+i);
		}
		
		
	}
	
}

 

以上是关于如何让正在运行的线程暂停一段时间的主要内容,如果未能解决你的问题,请参考以下文章

Java线程休眠和线程让步

js中怎么让程序暂停一段时间

如何暂停线程池、运行函数和恢复?

安全地暂停线程[重复]

Java中并发问题整理

您好,你之前提的关于QThread暂停和继续运行的问题,请问最后是如何解决的?