`
wang吖
  • 浏览: 234589 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Condition线程通信-线程执行过程中进行条件切换-学习笔记11

阅读更多

Java5 中提过了Condition ,该类可以实现线程间的条件控制,废话少说直接来看一个实例。

实例:

       启动两根子线程,连同主线程一共3根线程,实现子线程1执行5次切换至子线程2执行5次,再切换至主线程执行5,然后切换至子线程1执行5次,如此往复3次,程序退出。

 

程序代码:

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

/**
 * 通过Condition来实现线程间的通信
 * 
 * @author 吖大哥
 * @date May 24, 2014 6:43:26 PM
 */
public class ThreeConditionTest {

	public static void main(String[] args) {
		final Business1 bs = new Business1();

		new Thread(new Runnable() {
			public void run() {
				for (int i = 0; i < 3; i++) {
					bs.sub1(i);
				}
			}
		}).start();

		new Thread(new Runnable() {
			public void run() {
				for (int i = 0; i < 3; i++) {
					bs.sub2(i);
				}
			}
		}).start();

		for (int i = 0; i < 3; i++) {
			bs.sub3(i);
		}
	}
}

class Business1 {

	private Lock lock = new ReentrantLock();
	private int flag = 1;
	private Condition c1 = lock.newCondition();
	private Condition c2 = lock.newCondition();
	private Condition c3 = lock.newCondition();

	public void sub1(int i) {
		lock.lock();
		try {
			while (flag != 1) {
				try {
					c1.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int j = 0; j < 5; j++) {
				System.out.println("Sub1 第 " + i + " 次执行*****" + j);
			}
			flag = 2;
			c2.signal();
		} catch (RuntimeException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}

	public void sub2(int i) {
		lock.lock();
		try {
			while (flag != 2) {
				try {
					c2.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int j = 0; j < 5; j++) {
				System.out.println("Sub2 第 " + i + " 次执行*****" + j);
			}
			flag = 3;
			c3.signal();
		} catch (RuntimeException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}

	public void sub3(int i) {
		lock.lock();
		try {
			while (flag != 3) {
				try {
					c3.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int j = 0; j < 5; j++) {
				System.out.println("Sub3 第 " + i + " 次执行*****" + j);
			}
			flag = 1;
			c1.signal();
		} catch (RuntimeException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
}

 

执行结果:

Sub1 第 0 次执行*****0
Sub1 第 0 次执行*****1
Sub1 第 0 次执行*****2
Sub1 第 0 次执行*****3
Sub1 第 0 次执行*****4
Sub2 第 0 次执行*****0
Sub2 第 0 次执行*****1
Sub2 第 0 次执行*****2
Sub2 第 0 次执行*****3
Sub2 第 0 次执行*****4
Sub3 第 0 次执行*****0
Sub3 第 0 次执行*****1
Sub3 第 0 次执行*****2
Sub3 第 0 次执行*****3
Sub3 第 0 次执行*****4
Sub1 第 1 次执行*****0
Sub1 第 1 次执行*****1
Sub1 第 1 次执行*****2
Sub1 第 1 次执行*****3
Sub1 第 1 次执行*****4
Sub2 第 1 次执行*****0
Sub2 第 1 次执行*****1
Sub2 第 1 次执行*****2
Sub2 第 1 次执行*****3
Sub2 第 1 次执行*****4
Sub3 第 1 次执行*****0
Sub3 第 1 次执行*****1
Sub3 第 1 次执行*****2
Sub3 第 1 次执行*****3
Sub3 第 1 次执行*****4
Sub1 第 2 次执行*****0
Sub1 第 2 次执行*****1
Sub1 第 2 次执行*****2
Sub1 第 2 次执行*****3
Sub1 第 2 次执行*****4
Sub2 第 2 次执行*****0
Sub2 第 2 次执行*****1
Sub2 第 2 次执行*****2
Sub2 第 2 次执行*****3
Sub2 第 2 次执行*****4
Sub3 第 2 次执行*****0
Sub3 第 2 次执行*****1
Sub3 第 2 次执行*****2
Sub3 第 2 次执行*****3
Sub3 第 2 次执行*****4

 

执行过程分析:



 

 

  • 大小: 49 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics