`
chenzehe
  • 浏览: 539488 次
  • 性别: 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线程中wait,await,sleep,yield,join用法总结.pdf

    在Java编程中,多线程的使用是实现程序并发运行的重要手段。本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    java多线程Demo

    在多线程环境下,可能会出现数据竞争问题,为了解决这个问题,Java提供了多种同步机制,如synchronized关键字、wait/notify机制、Lock锁(ReentrantLock)等。synchronized用于控制对共享资源的访问,而wait/notify...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

    Java多线程技术精讲

    Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 ...

    Java多线程实现异步调用实例

    在Java编程中,多线程和异步调用是提高应用程序性能和响应能力的重要手段。在本实例中,我们将深入探讨如何使用Java实现多线程以实现异步调用,并理解其背后的机制。 首先,多线程允许一个程序同时执行多个任务。在...

    java多线程示例

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应速度。本示例着重探讨如何在Java中实现和管理多线程,以及它带来的挑战和解决方案。 一、Java多线程基础 1. ...

    java 多线程.ppt,多线程

    为了避免多线程环境下资源竞争导致的数据不一致,Java提供了多种同步机制,包括synchronized关键字、Lock接口、wait()和notify()等。synchronized可以保证同一时间只有一个线程访问临界区,Lock提供更细粒度的锁...

    java 多线程编程指南

    在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统效率和响应性。这份“Java多线程编程指南”深入探讨了这一主题,为中级到高级的Java开发者提供了宝贵的资源。 首先,多线程...

    Java多线程的总结

    Java多线程是Java编程中的一个核心概念,它在现代软件开发中扮演着至关重要的角色。多线程允许程序同时执行多个任务,提高了系统资源的利用率,提升了应用程序的响应速度和并发性能。对于大型分布式系统、Web应用...

    java多线程源码-source

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。接下来,我们将深入探讨这两个方法以及相关的...

    JAVA多线程模式高清版+DEMO

    Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类或者实现`Runnable`接口。这个压缩包文件"JAVA多...

    深入浅出 Java 多线程.pdf_java_

    Java多线程是Java编程中的核心概念,尤其在如今并发性能至关重要的软件开发中,它的重要性不言而喻。深入理解Java多线程能够帮助开发者有效地利用计算机资源,提高程序的执行效率,优化系统性能。 Java多线程的实现...

    java多线程测试实例

    Java多线程是Java编程中的重要组成部分,尤其在并发编程领域,它扮演着核心角色。在实际项目中,多线程被广泛应用于提高系统效率、实现任务并行处理,以及优化资源利用。以下是对"java多线程测试实例"的详细解析: ...

    java多线程面试题59题集合

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提升系统效率。在面试中,对Java多线程的理解和熟练运用往往成为衡量开发者技能水平的重要标准。以下是对Java多线程面试题59题集合中可能涉及的...

    Java多线程编程模板

    在Java编程中,多线程是程序设计中的一个重要概念,特别是在服务器端应用和高并发场景下,多线程能够充分利用CPU资源,提高程序的执行效率。本知识点将深入探讨Java多线程编程模板,帮助开发者理解和掌握如何在Java...

    Java多线程编程实战指南 设计模式篇.rar

    在Java编程中,多线程是一项关键技能,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。设计模式则是解决常见编程问题的模板,通过应用这些模式,开发者可以构建更健壮、可维护的多线程系统。本实战...

    java_Thread.rar_java 多线程_java多线程

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。在Java中,通过实现Runnable接口或者继承Thread类可以创建并运行多线程。本资料"java_Thread.rar"提供...

    java 多线程

    ### Java多线程知识点详解 #### 一、Java Thread 概念 在Java中,**线程**是一种轻量级的进程,它是程序执行流的最小单元。一个标准的Java应用通常至少包含一个线程,即主(Main)线程。Java支持多线程编程,这...

Global site tag (gtag.js) - Google Analytics