Thread类的sleep,join,interrupt方法

本文深入探讨了Java中线程控制的重要概念,包括sleep(), join()和interrupt()方法的使用。通过对具体代码示例的分析,阐述了这些方法如何帮助开发者实现线程间的同步和中断操作,特别强调了它们在多线程环境下的作用机制和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sleep()、join()
import java.lang.Thread;
import java.io.IOException;

public class Test3 
{
	private int i = 10;
	private Object object = new Object();
	public static  void  main(String[] args) throws IOException{
		Test3 t = new Test3();
		MyThread thread1 = t.new MyThread();
		MyThread thread2 = t.new MyThread();
		thread1.start();
		thread2.start();
		try {
            System.out.println("线程"+Thread.currentThread().getName()+"等待");
            thread2.join();//调用thread.join方法,则main方法会等待thread线程执行完毕或者等待一定的时间。
			//如果调用的是无参join方法,则等待thread执行完毕,如果调用的是指定了时间参数的join方法,则等待一定的时间。
			//实际上调用join方法是调用了Object的wait方法。
			//wait方法会让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。
            System.out.println("线程"+Thread.currentThread().getName()+"继续执行");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
	}
	class MyThread extends Thread
	{
		@Override
		public void run(){
			//synchronized (object){ //同步锁,当前线程运行完才释放锁。
				i++;
				System.out.println("i:"+i);
				try{
					System.out.println("线程"+Thread.currentThread().getName()+"进入睡眠状态");
					Thread.currentThread().sleep(10000); //sleep相当于让线程睡眠,交出CPU,让CPU去执行其他的任务.sleep方法不会释放锁,
					//也就是说如果当前线程持有对某个对象的锁,则即使调用sleep方法,其他线程也无法访问这个对象
					//如果调用了sleep方法,必须捕获InterruptedException异常或者将该异常向上层抛出。当线程睡眠时间满后,不一定会立即得到执行,
					//因为此时可能CPU正在执行其他的任务。所以说调用sleep方法相当于让线程进入阻塞状态
				}catch(InterruptedException e){
					System.out.println("进程睡眠失败");
				}
				System.out.println("线程"+Thread.currentThread().getName()+"睡眠结束");
				i++;
				System.out.println("i:"+i);
			//}
		}
	}
}

interrupt()
import java.lang.Thread;
import java.io.IOException;

public class  Test4
{
	private int i = 0;
	public static void main(String[] args) throws IOException
	{
		Test4 t = new Test4();
		MyThread thread0 = t.new MyThread();
		MyThread thread1 = t.new MyThread();
		thread0.start();
		thread1.start();
		thread1.interrupt();
		//单独调用interrupt方法可以使得处于阻塞状态的线程抛出一个异常,
		//也就说,它可以用来中断一个正处于阻塞状态的线程;
		//另外,通过interrupt方法和isInterrupted()方法来停止正在运行的线程。
		//直接调用interrupt方法不能中断正在运行中的线程。
	}
	class MyThread extends Thread
	{
		@Override
		public void run(){
			i++;
			System.out.println("i:"+i);
			try{
				System.out.println("线程"+Thread.currentThread().getName()+"进入睡眠");
				Thread.currentThread().sleep(10000);
				System.out.println("线程"+Thread.currentThread().getName()+"睡眠完毕");
			}catch(InterruptedException e){
				System.out.println("线程"+Thread.currentThread().getName()+"中断异常");
			}
			System.out.println("run方法执行完毕");
			i++;
			System.out.println("i:"+i);
		}
	}
}

### Java中`Thread`的`sleep`方法功能与使用教程 #### 1. **`Thread.sleep(long millis)` 方法概述** - **基本功能** `Thread.sleep(long millis)` 是 `Thread` 中的一个静态方法,用于让当前正在执行的线程进入休眠状态(即暂时停止运行)。在此期间,CPU 不会分配时间给这个线程,从而允许其他线程获得更多的 CPU 时间[^3]。当指定的时间结束或者线程被中断时,该线程才会恢复执行。 - **参数含义** 参数 `millis` 表示线程需要休眠的毫秒数。如果希望更加精确地控制休眠时间,还可以使用重载版本的方法 `Thread.sleep(long millis, int nanos)` 来增加纳秒级别的精度[^2]。 - **异常处理** 如果在休眠过程中线程被另一个线程通过调用 `interrupt()` 方法打断,则会抛出 `InterruptedException` 异常,并清除其中断标志位[^3]。因此,在编写涉及 `Thread.sleep()` 的程序时,通常需要将其实现放在 `try-catch` 块中以便妥善管理可能发生的异常状况。 --- #### 2. **典型应用场景** - **定时任务调度** 当某些逻辑需要按照固定间隔重复执行时可以利用 `Thread.sleep()` 实现简单版计时器效果。例如每秒钟打印一次消息: ```java public class TimerTask { public static void main(String[] args) { while (true){ System.out.println("Current Time: "+System.currentTimeMillis()); try{ Thread.sleep(1000); // 每隔一秒触发一次输出 }catch(InterruptedException ex){ System.out.println("Thread interrupted."); break; } } } } ``` - **模拟延迟加载数据** 在网络请求或其他耗时操作前加入短暂等待以提升用户体验或减轻服务器压力等情况也常用到此技术手段。 --- #### 3. **注意事项** - **不会释放锁资源** 需要注意的是即使处于休眠状态下,原先持有的同步块内的监视器仍然保持锁定状态并不会自动解锁[^2]。这意味着如果你在一个已经获取了某个对象锁的情况下调用了 `Thread.sleep()` ,那么在这段时间里别的任何试图访问同一份临界区代码段的线程都将被迫排队等候直到前者完全苏醒过来重新开始正常运转流程为止。 - **区别于 wait() 方法** 尽管两者都能造成当前进程暂停活动一段时间的表现形式相似之处颇多,但实际上它们之间存在着本质差异——`wait()` 必须配合特定条件变量一起协作完成整个生命周期管理工作而且只能由拥有对应实例关联起来之后才能生效;而相比之下 `sleep()` 则显得相对独立自主得多无需额外依赖外部环境因素即可单独发挥作用[^3]。 --- #### 4. **完整案例分析** 以下是综合运用以上知识点构建出来的具体例子演示如何正确合理应用 `Thread.sleep()` 达成预期目的: ```java class Task extends Thread { private String name; public Task(String name){ this.name = name; } @Override public void run(){ for(int i=0;i<5;i++){ System.out.println(name+" is running - count:"+i); try{ Thread.sleep((long)(Math.random()*1000)); // Random sleep between 0 to 999 ms. }catch(InterruptedException ie){ System.out.println(name +" was interrupted!"); return ; } } } } public class MultiThreadingWithSleep { public static void main(String []args)throws Exception{ Task t1=new Task("T1"); Task t2=new Task("T2"); t1.start(); t2.start(); t1.join(); // Wait until T1 finishes its execution. t2.join(); // Then proceed after both threads have finished. System.out.println("All tasks completed successfully."); } } ``` 在这个范例当中我们创建了两个继承自 `Thread` 的子别代表不同的工作任务单元并通过启动各自对应的实例化对象实现了并发计算模式下的交互体验同时借助于 `join()` 确保主线程能够有序跟进所有派生分支的状态变化轨迹最终达成一致性的全局视角观察结论。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值