文档章节

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
Java 复习 —— 多线程中断

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

learn_more
2015/09/09
64
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
学习笔记1:java多线程机制之线程概念

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

牧羊人Berg
2015/10/15
98
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 程序员左轮轮盘赌注

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享Bon Jovi的单曲《You Give Love a Bad Name》 《You Give Love a Bad Name》- Bon Jovi 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
38分钟前
558
12
oracle 用户密码过期-ORA-28001: 口令已经失效

oracle 用户密码过期-ORA-28001: 口令已经失效 操作步骤: [BEGIN] 2018-10-23 17:25:43Last login: Mon Sep 3 08:46:32 2018 from 10.2.202.12#登陆数据库#(1)在命令窗口中输入:...

诺岚
42分钟前
2
0
[转载]Yarn作业提交流程

1、yarn简述 yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式操作系统平台,而mapreduce等运算程序则相当于运行与操作系统之上的应用程序。yarn在hadoop2.x系列...

hnairdb
46分钟前
0
0
WebSocketdemo

WebSocket是html5提供的一种在单个tcp连接上进行全双工通讯的协议。 Http协议是无状态、无连接的、单向的应用层协议,采用了请求响应模型,通信请求智能有客户端发起,服务端对请求做出应答处...

qiang123
52分钟前
1
0
谷歌推迟公布Google+漏洞遭参议员不满

参议院商务委员会主席约翰·图恩和另外两位参议员杰瑞·莫兰和罗杰·维克发出信函,要求谷歌解释推迟披露此问题的原因。信中称:“谷歌如果要保持或重获用户对其服务的信任,就必须在公众和立...

linuxCool
59分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部