文档章节

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
码字总数 11158
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Feign 异常处理

问题 最近在项目开发中,使用 Feign 调用服务,当触发熔断机制时,遇到了以下问题: 异常信息形如:TestService#addRecord(ParamVO) failed and no fallback available.; 获取不到服务提供方...

xiaomin0322
22分钟前
2
0
解决OSX使用oh-my-zsh后.bash_profile自定义失效

场景描述 为了使OSX自带的终端在使用上更加顺手,便安装了oh-my-zsh插件, 但发现之前在.bash_profile自定义的一些内容都失效了。 问题分析 oh-my-zsh有自己的配置文件,覆盖了.bash_profile...

SuShine
25分钟前
1
0
java中线程读取配置文件properties

配置文件在很多方面可以用到,比如数据库连接,数据库工厂方法的调用,只要在配置文件中修改即可,不用修改程序,使用起来还是很方便的。 现在演示一下通过线程读取配置文件进行反射的一种方...

寒风中的独狼
28分钟前
3
0
面向接口编程详解-Java篇

  相信看到这篇文字的人已经不需要了解什么是接口了,我就不再过多的做介绍了,直接步入正题,接口测试如何编写。那么在这一篇里,我们用一个例子,让各位对这个重要的编程思想有个直观的印...

浮躁的码农
28分钟前
3
0
NPM install -save 和 -save-dev 傻傻分不清

本文原文地址:https://www.limitcode.com/detail/59a15b1a69e95702e0780249.html 回顾 npm install 命令 最近在写Node程序的时候,突然对 npm install 的-save和-save-dev 这两个参数的使用...

翔飘飘
30分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部