wait、notify、join、yield、sleep、interrupt的介绍
博客专区 > dev_chao 的博客 > 博客详情
wait、notify、join、yield、sleep、interrupt的介绍
dev_chao 发表于6个月前
wait、notify、join、yield、sleep、interrupt的介绍
  • 发表于 6个月前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

Object.wait()/notify/notifyAll():导致线程进入等待状态,直到它被其他线程通过notify()或者notifyAll唤醒。该方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。注:wait方法会使线程放弃持有的锁。

package com.devchao.waitNotify;

public class Test {
	
	private Object obj = new Object();
	
	public synchronized void sync() throws InterruptedException {
		this.wait();//correct usage
	}
	
	public synchronized void sync2() throws InterruptedException {
		obj.wait();//wrong usage
	}
	
	public void sync3() throws InterruptedException {
		synchronized(obj) {
			obj.wait();//correct usage
		}
	}
	
	public void sync4() throws InterruptedException {
		synchronized(this) {
			obj.wait();//wrong usage
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		new Test().sync();
	}
}

wait/notify 用法demo

package com.devchao.waitNotify;

public class WaitNotifyDemo {
	
	private static final Object obj = new Object();
	
	
	public static void main(String[] args) {
		new Thread(new Waiter()).start();
		new Thread(new Notifyer()).start();
	}

	static class Waiter implements Runnable {
		
		@Override
		public void run() {
			
			System.out.println("waiter working");
			
			//do things 
			//......
			
			synchronized (obj) {
				try {
					obj.wait();//wait for another thread's notify
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			//and do things
			//......
			
			System.out.println("waiter done");
		}
	}
	
	static class Notifyer implements Runnable {
		
		@Override
		public void run() {
			
			System.out.println("notifyer working");
			
			//do things 
			//......
			
			synchronized (obj) {
				obj.notify();
			}
			
			System.out.println("notifyer done");
		}
	}
	
	
	
	
}

Thread.join():把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。

package com.devchao.join;

import java.util.Random;

public class JoinTest implements Runnable {
	private int i;
	
	public JoinTest(int i) {
		this.i = i;
	}
	
	@Override
	public void run() {
		int seconds = new Random().nextInt(100) * 100;
		try {
			Thread.sleep(seconds);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("thread" + i + " completed. cost:" + seconds);
	}
	
	public static void main(String[] args) throws InterruptedException {
		Thread th1 = new Thread(new JoinTest(1));
		Thread th2 = new Thread(new JoinTest(2));
		th1.start();
		th2.start();
		
		th1.join();
		th2.join();
		System.out.println("all completed");
	}
}

Thread.yield():使当前线程从执行状态(运行状态)变为可执行态(就绪状态),也就是说让出当前线程分到的时间片,重新竞争CPU。

Thread.sleep(millis):使当前线程暂停所指定的毫秒,转到执行其它线程。注:sleep操作不会释放当前线程持有的锁。

Thread.interrupt():该方法不会中断一个正在运行的线程。它的作用是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。注:interrupt方法并不是强制终止线程,它只能设置线程的interrupted状态。

package com.devchao.interrupt;

public class Test implements Runnable {

	@Override
	public void run() {
		int i = 0;
		while(!Thread.interrupted() && i < 100000) {
			i++;
			System.out.println("print:" + i);
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		Thread th = new Thread(new Test());
		th.start();
		
		Thread.sleep(10);
		th.interrupt();
	}

}

 

共有 人打赏支持
粉丝 4
博文 32
码字总数 10996
×
dev_chao
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: