文档章节

wait、notify、join、yield、sleep、interrupt的介绍

dev_chao
 dev_chao
发布于 2017/04/10 17:13
字数 629
阅读 5
收藏 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();
	}

}

 

© 著作权归作者所有

共有 人打赏支持
dev_chao
粉丝 3
博文 36
码字总数 11281
作品 0
广州
Java多线程基础篇(04)-线程同步机制和线程间通信

1.线程的等待与唤醒 本节包括wait(),notify(),notifyAll()介绍。以及为什么notify,wait等方法要定义在Object中而不是Thread中。 1.1 wait,notify,notifyAll方法介绍 在Object中,定义了wai...

kukudeku
2016/09/21
48
0
Java 复习 —— 线程相关方法介绍

1、sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁(如果是在Synchronized块中的话,他是不会释放锁的)。也就是说如果有synch...

learn_more
2015/08/28
62
0
Thread 的几个概念sleep、wait、yield、interrupt

yield和sleep的区别 JDK1.5.0的API文档里的描述: yield:Causes the currently executing thread object to temporarily pause and allow other threads to execute. sleep:Causes the curre......

onedotdot
2017/10/19
0
0
Java 复习 —— 多线程中断

1、interrupt中断线程 1、interrupt 会给wait池中的线程抛出异常,这个时候该线程会被唤醒,但是同样还要继续竞争锁资源,才能继续运行! 2、interrupt 会给正在sleep的线程抛出异常,但是不...

learn_more
2015/09/09
64
0
学习笔记1:java多线程机制之线程概念

由于种种需求,今天开始由浅入深的学习java的多线程机制,而java语言的一大特性点就是内置对多线程的支持。 以下内容出自: http://blog.csdn.net/jiangwei0910410003/article/details/1996...

牧羊人Berg
2015/10/15
98
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

困扰当前数据中心管理的三大难题

导读 当企业发展到一定程度,或者之前的机房不能满足现在的数据中心使用时,企业会对数据中心进行迁移。那么在数据中心进行迁移的时候会遇到哪些风险呢?针对这些风险我们应该做出怎样的措施来...

问题终结者
5分钟前
0
0
设计模式:工厂方法模式(工厂模式)

工厂方法模式才是真正的工厂模式,前面讲到的静态工厂模式实际上不能说是一种真正意义上的设计模式,只是一种变成习惯。 工厂方法的类图: 这里面涉及到四个种类: 1、抽象产品: Product 2、...

京一
22分钟前
0
0
区块链和数据库,技术到底有何区别?

关于数据库和区块链,总会有很多的困惑。区块链其实是一种数据库,因为他是数字账本,并且在区块的数据结构上存储信息。数据库中存储信息的结构被称为表格。但是,区块链是数据库,数据库可不...

HiBlock
29分钟前
0
0
react native 开发碰到的问题

react-navigation v2 问题 问题: static navigationOptions = ({navigation, navigationOptions}) => ({ headerTitle: ( <Text style={{color:"#fff"}}>我的</Text> ), headerRight: ( <View......

罗培海
36分钟前
0
0
Mac Docker安装流程

久仰Docker大名已久,于是今天趁着有空,尝试了一下Docker 先是从docker的官网上下载下来mac版本的docker安装包,安装很简易,就直接拖图标就好了。 https://www.docker.com/products/docker...

writeademo
44分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部