【Java】线程中的wait和notify

线程中的同步问题通常使用的是synchronized块,结合wait和notify方法,今天简单做了一个测试。发现当一个线程锁定了某个临界资源后另一个线程会自动等待,以往自己还认为需要自己写代码让其等待呢。。。

共享资源:

package sm.model;

import org.apache.log4j.Logger;

public class ThreadFuncs {
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(ThreadFuncs.class);

	private int shareNum;

	public ThreadFuncs(int initShareNum)
	{
		this.shareNum = initShareNum;
	}

	public void run1() {
		if (shareNum < 10) {
			synchronized (this) {
				for (; shareNum < 30; shareNum++) {
					logger.info("I go to print " + shareNum);
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					if (shareNum == 10) {
						try {
							this.wait();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}
			}
		}
	}

	public void run2() {
		/*logger.info("I am in run2 " + shareNum);

		while (shareNum == 0) {
			try {
				logger.info("I am in while " + shareNum);
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}*/

		synchronized (this) {
			for (; shareNum < 20; shareNum++) {
				logger.info("print " + shareNum);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			this.notify();
		}

	}
}

线程1:

package sm.examples.threaddemo;

import sm.model.ThreadFuncs;

public class Thread3_1 extends Thread {

	private ThreadFuncs funcs;

	public Thread3_1(ThreadFuncs funcs)
	{
		this.funcs = funcs;
	}

	@Override
	public void run() {
		funcs.run1();
	}

}

线程2:

package sm.examples.threaddemo;

import sm.model.ThreadFuncs;

public class Thread3_2 extends Thread {

	private ThreadFuncs funcs;

	public Thread3_2(ThreadFuncs funcs)
	{
		this.funcs = funcs;
	}

	@Override
	public void run() {
		funcs.run2();
	}

}

测试类:

package sm.test;

import org.junit.Test;

import sm.examples.threaddemo.Thread3_1;
import sm.examples.threaddemo.Thread3_2;
import sm.model.ThreadFuncs;

public class TestThreadWaitNotifyDemo {
	@Test
	public void test()
	{
		ThreadFuncs funcs = new ThreadFuncs(0);

		Thread t1 = new Thread3_1(funcs);
		Thread t2 = new Thread3_2(funcs);

		t1.start();
		t2.start();

		try {
			Thread.sleep(100000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}
时间: 2024-08-29 15:10:57

【Java】线程中的wait和notify的相关文章

Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别

Java线程中sleep().wait()和notify()和notifyAll().suspend和resume().yield().join().interrupt()的用法和区别 从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield. 或者当前正在被服务的线程需要睡一会,醒来后继续被服务,这就是sleep. 

在Java 线程中返回值的用法

http://icgemu.iteye.com/blog/467848 在Java 线程中返回值的用法 博客分类: Java Javathread 有时在执行线程中需要在线程中返回一个值:常规中我们会用Runnable接口和Thread类设置一个变量:在run()中改变变量的值,再用一个get方法取得该值,但是run何时完成是未知的:我们需要一定的机制来保证. 在在Java se5有个Callable接口:我们可以用该接口来完成该功能: 代码如: Java代码   package com.thr

Java线程中锁的问题

Java线程中锁的问题: 同步代码块的锁是自己定义的类:object obj = new object 同步方法的锁是this 静态同步方法的锁是类名.class

Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别

从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield. 或者当前正在被服务的线程需要睡一会,醒来后继续被服务,这就是sleep. sleep方法不推荐使用,可用wait. 线程退出最好自己实现,在运行状态中一直检验一个状态,如果这个状态为真,就一直运行,如果外界更改了这个状态变量,那么线程就停止运行. sleep(

JAVA线程间协作:wait.notify.notifyAll

JAVA的进程同步是通过synchronized()来实现的,须要说明的是,JAVA的synchronized()方法相似于操作系统概念中的相互排斥内存块.在JAVA中的Object类型中.都是带有一个内存锁的,在有线程获取该内存锁后.其它线程无法訪问该内存.从而实现JAVA中简单的同步.相互排斥操作. 明确这个原理.就能理解为什么synchronized(this)与synchronized(static XXX)的差别了.synchronized就是针对内存区块申请内存锁,thiskeywo

模拟做饭系统(java+线程中的join方法)

(一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+(没有调用jion方法) (二)有线程控制(妈妈进程和儿子进程又先后影响)+(调用jion方法) 项目的结构图: (二)没有进程控制mintak Son.java主要是模拟儿子的行动,儿子买酱油的行动(与有进程控制的源程序相同) 代码如下: public class Son implements R

JAVA 线程中的异常捕获

在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked exception处理掉.这一点是通过java.lang.Runnable.run()方法声明(因为此方法声明上没有throw exception部分)进行了约束.但是线程依然有可能抛出unchecked exception(如运行时异常),当此类异常跑抛出时,线程就会终结,而对于主线程和其他线程完全

Java线程中的同步

1.对象与锁 每一个Object类及其子类的实例都拥有一个锁.其中,标量类型int,float等不是对象类型,但是标量类型可以通过其包装类来作为锁.单独的成员变量是不能被标明为同步的.锁只能用在使用了这些变量的方法上.成员变量可以被声明为volatile,这种方式会影响该变量的原子性,可见性以及排序性.类似的,持有标量变量元素的数组对象拥有锁,但是其中的标量元素却不拥有锁.(也就是说,没有办法将数组成员声明为volatile类型的).如果锁住了一个数组并不代表其数组成员都可以被原子的锁定.也没有

深入分析java线程中的volatile

Volatile关键字 平时在阅读jdk源码的时候,经常看到源码中有写变量被volatile关键字修饰,但是却不是十分清除这个关键字到底有什么用处,现在终于弄清楚了,那么我就来讲讲这个volatile到底有什么用吧. 当一个变量被定义为volatile之后,就可以保证此变量对所有线程的可见性,即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的.可以理解成:对volatile变量所有的写操作都能立刻被其他线程得知.但是这并不代表基于volatile变量的运算在并发下是安