`
chenzehe
  • 浏览: 533657 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java多线程wait、notify、join、sleep、yiled

 
阅读更多

1、wait

     public final void wait(long timeout) throws InterruptedException

     此方法为Object类的方法,在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。当前线程必须拥有此对象监视器,也就是当前线程必须要有此对象的锁,该方法必须写在synchronized修饰的方法里或synchronized同步代码块里, 否则将抛出运行时异常IllegalMonitorStateException,wait()方法相当于wait(0)方法。


2、notify

    public final void notify()

    此方法为Object类中的方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。 该方法必须写在synchronized修饰的方法里或synchronized同步代码块里, 否则将抛出运行时异常IllegalMonitorStateException。

    public final void notifyAll()

    唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个 wait 方法,在对象的监视器上等待。

    如http://chenzehe.iteye.com/admin/blogs/1550701中的代码:

public class Info {
	private String country;
	private String city;
	private boolean flag = true; // true表示可以生产,但不能消费,false表示可以消费,但不能生产
	public synchronized void set(String country, String city) {
		if (!flag) {
			try {
				super.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		this.country = country;
		try {
			Thread.sleep(300);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.city = city;
		this.flag = false;
		super.notify();
	}
	public synchronized void get() {
		if (flag) {
			try {
				super.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("country:" + this.country + "->city:" + this.city);
		this.flag=true; 
		super.notify();
	}
	public String getCountry() {
		return country;
	}
	public void setCountry(String country) {
		this.country = country;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
}
 

3、join

    public final void join(long millis) throws InterruptedException

    是Thrad类中的方法,等待该线程终止的时间最长为millis 毫秒。超时为 0 意味着要一直等下去。public final void join()相当于join(0)。也就是使异步执行的线程变成同步,即等到该线程执行完成返回才往下执行下面代码。

    如http://chenzehe.iteye.com/admin/blogs/1741137中代码:

public class MyRunnable implements Runnable {
	public static volatile int	n	= 0;
	
	public void run() {
		for (int i = 0; i < 10; i++) {
			try {
				n = n + 1;
				Thread.sleep(10);
			}
			catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}

public class MainTest {	
	public static void main(String[] args) throws Exception {
		Thread[] threads = new Thread[100];
		// 创建100个线程
		for (int i = 0; i < threads.length; i++) {
			threads[i] = new Thread(new MyRunnable());
		}
		// 启动100个线程
		for (int i = 0; i < threads.length; i++) {
			threads[i].start();
		}
		// 让100个线程都执行完
		for (int i = 0; i < threads.length; i++) {
			threads[i].join();
		}
		System.out.println(MyRunnable.n);
	}
}

 

   下面代码为join()的实现代码,发现join()也为synchronized方法,并且是调用wait()来实现的:

	public final synchronized void join(long millis) throws InterruptedException {
		long base = System.currentTimeMillis();
		long now = 0;
		
		if (millis < 0) {
			throw new IllegalArgumentException("timeout value is negative");
		}
		
		if (millis == 0) {
			while (isAlive()) {
				wait(0);
			}
		}
		else {
			while (isAlive()) {
				long delay = millis - now;
				if (delay <= 0) {
					break;
				}
				wait(delay);
				now = System.currentTimeMillis() - base;
			}
		}
	}
 

4、sleep

    public static void sleep(long millis) throws InterruptedException

    Thread类中的方法,在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。使当前线程暂停执行一段时间,让其它线程有机会执行,但它并不释放当前锁,其它线程仍不能访问共享数据。


5、yield

    Thread类中的方法,与sleep类似,只是不能由用户定义多长时间,并且yield()只能让具有同优先级的程序有执行的机会。

 

 

 

分享到:
评论

相关推荐

    JAVA多线程技术分享-39页PPT(winding)

    分享的多线程技术不是告诉你什么是线程,线程的状态,而是我们在开发中容易踩的坑,受过的伤害。我不会告诉你什么是爱情,但是我会告诉你爱过。 一 基础: 1,Thread.sleep(0)的作用 2,为什么线程会带来性能问题 3...

    这就是标题—— JUC.pdf

    多线程锁 并发下的集合类 List Set Map Callable接口 线程创建的方式 callable / runnable FutureTask JUC常用辅助类 CountDownLatch (减少计数器) CyclicBarrier(加法计数器) Semaphore(信号量,流量控制) ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】sleep()和wait()分别是哪个类的方法,有什么区别? 79 【多线程】sleep()和yield()的区别 79 【多线程】对synchronized理解?用在代码块和方法上有什么区别? 80 【多线程】Volatile的理解 82 【*多线程】...

    Java高级程序设计测试含答案.docx

    update() 在线程同步中,为了唤醒另一个等待的线程,使用下列方法 () [单选题] * A.sleep() B.wait() C.notify()(正确答案) D. join() Java高级程序设计测试含答案全文共40页,当前为第4页。Java提供以下哪个...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细介绍与知识点总结.mp4 │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细介绍与知识点总结.mp4 │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致...

    Java语言程序设计(一)真题及答案.doc

    A.sleep() B.notify() C.wait() D.join() 正确答案:B 您的答案: 本题解析: 暂无解析 2.以下标识符中,不是Java语言关键字的是()。 A.wait B.new C.long D.switch 正确答案:A 您的答案: 本题解析: 暂无解析 3....

    LeetCode判断字符串是否循环-java:Java

    LeetCode判断字符串是否循环 知识点总结 java基础 1、使用迭代器和for each循环查看集合元素时只能获得元素的值,不能改变元素 ...object的方法:wait(notify,notifyall),thread的方法:(sleep、join),结束

    JAVA程序设计教程

    Java程序.............................................................................................6 1.3.1 Java程序的结构 ...........................................................................

    java核心知识点整理.pdf

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

Global site tag (gtag.js) - Google Analytics