线程同步wait notify小例子

<strong>线程同步小例子:开启两个线程实现拿鸡蛋 放鸡蛋交叉进行</strong>
</pre><pre code_snippet_id="574008" snippet_file_name="blog_20150107_1_8603573" name="code" class="java">public class Dofunction {
	private int num;

	public  synchronized void getEgg(){
		while(num==0){
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		num--;
		System.out.println("拿鸡蛋");
		notify();
	}

	public synchronized void setEgg(){
		while(num!=0){
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		num++;
		System.out.println("放鸡蛋");
		notify();
	}
}
public class TestTread {

	public static void main(String[] args) {
		Dofunction set =new Dofunction();
		Thread t1 = new GetEgeThread(set);
		Thread t2 = new Thread(new SetEggThread(set));
		t1.start();
		t2.start();
	}

}

/**
 * 对于同一对象而言才存在同步的问题,所以有一个接受对象的构造方法
 *
 */
class SetEggThread implements Runnable {
	private Dofunction set;

	public SetEggThread(Dofunction set) {
		this.set = set;
	}
	@Override
	public void run() {
		for (int i = 0; i < 20; i++) {
			set.setEgg();
		}
	}
}

class GetEgeThread extends Thread {
	private Dofunction set;

	public GetEgeThread(Dofunction set) {
		this.set = set;
	}
	@Override
	public void run() {
		for (int i = 0; i < 20; i++) {
			set.getEgg();
		}
	}
}
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
放鸡蛋
拿鸡蛋
时间: 2024-10-11 14:32:04

线程同步wait notify小例子的相关文章

VC++线程同步(四) 事件使用例子

事件(Event)同步对象 (内核级别)事件内核对象包含: 1 一个使用计数器 2 一个表示事件是否是自动重置还是手动重置的布尔值 3 一个表示事件有没有被触发的布尔值 4 当触发为true时,等待该事件的线程变为可调度状态 5 事件的触发表示一个操作已经完成 作用: 通知其他线程,我已经完成读写操作了,轮到你们来做了. 他分为两种类型: 1是手动重置事件,也就是要进行手动的触发和非触发状态的切换. 2是自动重置事件,这种情况下只需要设置触发事件,不用管什么时候切换触发状态. 尽量使用手动重置方

VC++线程同步(三) 临界区使用例子

临界区(Crtical Section)同步对象 用户模式下的同步对象 Win32中,最容易使用的一个同步机制就是(关键段)Critical Section, 某些共享资源具有互斥性,也就是它要求被互斥地使用,他也是用于资源的互斥, 在大部分情况下,使用临界区替换Mutex(Mutex是内核模式下的同步对象). 局限性:他只能用于同步单个进程中的线程. 在任何同步机制当中,无论是哪个操作系统下,都不要 长时间的锁住资源,如果一直锁定资源,就会一致阻止其他线程的执行, 使整个程序,处于完全停止的状

VC++线程同步(五) 信号量使用例子

信号量(Semaphore) 信号量是内核对象,使用几个形象的例子,进行描述. 1 假设有5个位置,而外面有很多人要进来,那么当5个位置被人占用了 后,其他人就必须排队等待,每个人使用时间不同,5个占用的位置,其中有两个完成了,那么,排队的人中,最前面的两个人进行可以使用,但是最多就是5个人同时能够使用,这就是信号量. 2 例如我们在服务器中创建了一个线程池,它由5个线程组成,也就意味着,最多同时处理5个请求,一旦超过5个,那么请求就放入缓冲中,当一个或多个请求(最多5个)完成后,那么从缓冲中拿

swift详解之十五------------NSThread线程同步锁

NSThread线程同步锁 上小节用NSThread实现读取网络图片 , 这节用NSThread 模拟一个卖票的例子 .用NSLock 或者NSCondition 锁定资源 var total = 100 //总票数 var w1 = 0 //窗口1卖出票数 var w2 = 0 //窗口2卖出票数 var isSell = true //是否出售 var lock:NSLock? var condition:NSCondition? 这里首先定义一些变量 然后再点击卖票的时候,开启连个线程模仿

C#中的线程(二)线程同步

C#中的线程(二)线程同步 Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslator: Swanky WuPublished: http://www.cnblogs.com/txw1958/Download:http://www.albahari.info/threading/threading.pdf 第二部分:线程同步基础 同步要领 下面的表格列展了.NET对协调或同步线程动作的

【编写高质量代码C#】建议72:在线程同步中使用信号量

1.使用信号机制提供线程同步的一个简单例子 AutoResetEvent autoResetEvent = new AutoResetEvent(false); private void button1_Click(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false; Thread tWork = new Thread(() => { label1.Text = "线程启动...&quo

一起talk C栗子吧(第一百一十六回:C语言实例--线程同步之互斥量二)

各位看官们,大家好,上一回中咱们说的是线程同步之信号量的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 我们在上一回中详细介绍了互斥量相关函数的用法,这一回中,我们介绍如何使用这些函数来操作互斥量. 下面是详细的操作步骤: 1.定义一个互斥量A,用来同步线程: 2.在创建线程的进程中使用pthread_mutex_init函数初始化互斥量,互斥量的属性使用默认值: 3.在读取数据的线程中读取数据,首先使用pthread_mutex_lock函数对互斥量A进行加锁

C#中的线程(二) 线程同步基础

1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程完成                       锁系统 构成 目的 跨进程? 速度 lock 确保只有一个线程访问某个资源或某段代码. 否 快 Mutex 确保只有一个线程访问某个资源或某段代码.可被用于防止一个程序的多个实例同时运行. 是 中等 Semaphore 确保不超过指定数目的线程访问某

C#并行编程(6):线程同步面面观

理解线程同步 线程的数据访问 在并行(多线程)环境中,不可避免地会存在多个线程同时访问某个数据的情况.多个线程对共享数据的访问有下面3种情形: 多个线程同时读取数据: 单个线程更新数据,此时其他线程读取数据: 多个线程同时更新数据. 显而易见,多个线程同时读取数据是不会产生任何问题的.仅有一个线程更新数据的时候,貌似也没有问题,但真的没有问题吗?多个线程同时更新数据,很明显,你可能把我的更改覆盖掉了,数据从此不再可信. 什么是线程同步 为了解决多线程同时访问共享数据可能导致数据被破坏的问题,我们