Thread类的sleep,join,interrupt方法

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值