Java线程总结(七):并发包------线程通信condition

package com.ydj;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class conditionTest {
	public static void main(String[] args) {
		ExecutorService pool = Executors.newFixedThreadPool(2);
		final Business business = new Business();
		// 子线程1 说50次,每次说10句话
		pool.execute(new Runnable() {
			@Override
			public void run() {
				for (int i = 1; i <= 50; i++) {
					business.sub1Say(i);
				}
			}
		});
		// 子线程2 说50次,每次说10句话
		pool.execute(new Runnable() {
			@Override
			public void run() {
				for (int i = 1; i <= 50; i++) {
					business.sub2Say(i);
				}
			}
		});
		// 主线程 说50次,每次说50句话
		for (int i = 1; i <= 50; i++) {
			business.mainSay(i);
		}
	}

}

class Business {
	Lock lock = new ReentrantLock();
	Condition subCondition1 = lock.newCondition();
	Condition subCondition2 = lock.newCondition();
	Condition mainCondition = lock.newCondition();
	// 当前说话线程的标志
	private int sayNum = 1;

	/**
	 * sayNum==1时,子线程1说10句话,否则等待
	 * @param @param i   
	 * @return void  
	 * @throws
	 * @author yuandejin
	 * @date 2016-9-13
	 */
	public void sub1Say(int i) {
		try {
			lock.lock();
			while (sayNum != 1) {
				try {
					subCondition1.await();// 等待
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int j = 1; j <= 10; j++) {
				System.out.println("子线程1: 第" + i + "次,说第 " + j + "句话!");
				if (j == 10)
					System.out.println("----------------------");
			}
			sayNum = 2;
			subCondition2.signal();// 通知子线程2执行
		} finally {
			lock.unlock();
		}

	}
	
	/**
	 * sayNum==2时,子线程2说10句话,否则等待
	 * @param @param i   
	 * @return void  
	 * @throws
	 * @author yuandejin
	 * @date 2016-9-13
	 */
	public void sub2Say(int i) {
		try {
			lock.lock();
			while (sayNum != 2) {
				try {
					subCondition2.await();// 等待
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int j = 1; j <= 10; j++) {
				System.out.println("子线程2: 第" + i + "次,说第 " + j + "句话!");
				if (j == 10)
					System.out.println("----------------------");
			}
			sayNum = 3;
			mainCondition.signal();// 通知主线程执行
		} finally {
			lock.unlock();
		}

	}

	/**
	 * sayNum==3时,主线程说50句话,否则等待
	 * @param @param i   
	 * @return void  
	 * @throws
	 * @author yuandejin
	 * @date 2016-9-13
	 */
	public void mainSay(int i) {
		try {
			lock.lock();
			while (sayNum != 3) {
				try {
					mainCondition.await();// 等待
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int j = 1; j <= 50; j++) {
				System.out.println("主线程: 第" + i + "次,说第 " + j + "句话!");
				if (j == 50)
					System.out.println("----------------------");
			}
			sayNum = 1;
			subCondition1.signal();// 通知子线程1执行
		} finally {
			lock.unlock();
		}
	}
}


本课程主要以口袋西游为例,学习一个网络游戏是怎么通过游戏服务器与玩家客户端进行通信交互的,通过OD,CE等工具对游戏进行调试,到各个数据基址(例如角色基址,背基址等),出游戏里面的功能CALL(例如寻路CALL,打坐CALL等)及参数分析,并且编码实现功能。本课程可以带领你游戏逆向入门可以学会 CE,OD,游戏基址,功能CALL等实现变态功能可以更深入的理解从高级语言到汇编语言的一个对应过程可以学会 逆向软件  外挂与反外挂 破解防破解  游戏安全的基础知识可以为以后的及逆向高级课程 打下良好的基础可以自己分析游戏数据,用C语言实现游戏外挂功能等重点:  本套课程的重点就是带领大家分析游戏数据,毫不客气的说,各位学完此套课程对分析游戏数据这块会有一个质的飞跃。课程目录  01.课程简介及功能演示  02.CE人物基址及人物属性偏移  03.OD人物基址及人物属性偏移  04.创建MFC DLL项目  05.代码实现输出人物信息  06.发包函数概述  07.怎么看待重写的发包函数  08.普通发包线程发包  09.打坐CALL及参数分析  10.代码实现打坐CALL  11.喊话CALL及参数分析  12.代码实现喊话CALL  13.寻路CALL及参数分析  14.代码编写寻路CALL  15.穿装备CALL及参数分析  16.代码实现穿装备CALL  17.NPC对话CALL  18.代码实现NPC对话CALL  19.唤出宠物  20.宠物合体  21.收回宠物  22.取下宠物
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值