java 之 三个线程交替执行任务

原创 2012年03月22日 00:02:13
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Condition实现线程间通信
 * @author ETHAN
 *
 */
public class ThreeConditionCommunicationTest {

	public static void main(String[] args) {
		final Business business = new Business();
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				for(int i=1;i<=50;i++) {
					business.sub2(i);
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				for(int i=1;i<=50;i++) {
					business.sub3(i);
				}
			}
		}).start();

		for(int i=1;i<=50;i++) {
			business.main(i);
		}
	}
	
	static class Business {
		//synchronized 用 lock替代
		Lock lock = new ReentrantLock();
		//老大
		Condition condition1 = lock.newCondition();
		//老二
		Condition condition2 = lock.newCondition();
		//老三
		Condition condition3 = lock.newCondition();
		private int shouldSub = 1;//子线程
		
		//处理子线程
		public void sub2(int i) {
			lock.lock();
			
			try {
				//如果不是子线程
				//如果不等于2,老二等着
				while(shouldSub!=2) {
					try {
						condition2.await();
					} catch(InterruptedException e) {
						e.printStackTrace();
					}
				}
				
				for(int j=1;j<=10;j++) {
					System.out.println("sub2 thread sequence of "+j + " loop of "+i);
				}
				
				//该老三了
				shouldSub = 3;
				condition3.signal();
			} finally {
				lock.unlock();
			}
			
		}
		
		//处理子线程
		public void sub3(int i) {
			lock.lock();
			
			try {
				//如果不是子线程
				//不等于3,老三就等着
				while(shouldSub!=3) {
					try {
						condition3.await();
					} catch(InterruptedException e) {
						e.printStackTrace();
					}
				}
				
				for(int j=1;j<=20;j++) {
					System.out.println("sub3 thread sequence of "+j + " loop of "+i);
				}
				
				shouldSub = 1;
				condition1.signal();
			} finally {
				lock.unlock();
			}
			
		}
		
		//处理子线程
				public synchronized void main(int i) {
					lock.lock();
					try {
						//如果是子线程,主线程等待
						while(shouldSub!=1) {
							try {
								condition1.await();
							} catch(InterruptedException e) {
								e.printStackTrace();
							}
						}
						
						for(int j=1;j<=10;j++) {
							System.out.println("main thread sequence of "+j + " loop of "+i);
						}
						
						shouldSub = 2;
						condition2.signal();
					} finally {
						lock.unlock();
					}
					
				}
	}
}

	/*static class Business {
		private boolean bShouldSub = true;//子线程
		
		//处理子线程
		public synchronized void sub(int i) {
			//如果不是子线程
			while(!bShouldSub) {
				try {
					this.wait();
				} catch(InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			for(int j=1;j<=10;j++) {
				System.out.println("sub thread sequence of "+j + " loop of "+i);
			}
			
			bShouldSub = false;
			this.notify();
		}
		
		//处理子线程
				public synchronized void main(int i) {
					//如果是子线程,主线程等待
					while(bShouldSub) {
						try {
							this.wait();
						} catch(InterruptedException e) {
							e.printStackTrace();
						}
					}
					
					for(int j=1;j<=10;j++) {
						System.out.println("main thread sequence of "+j + " loop of "+i);
					}
					
					bShouldSub = true;
					this.notify();
				}
	}
}
*/

Java 多线程中。两个线程交替执行,一个输出偶数,一个输出奇数

描述 两个线程,一个打印100内的奇数一个打印100内的偶数,交替执行。 //要打印的资源 public class Num { int i=1; boolean flag = f...
  • woainiwss
  • woainiwss
  • 2016年07月24日 14:16
  • 10562

java两个线程交替执行

这个问题的来源是一个题目:线程A循环10次,线程B循环100,接着又回到线程A循环10次,接着再回到线程B又循环100,如此循环50次。 一般来说线程锁可以用:synchronized、Lock。 ...
  • keitho00
  • keitho00
  • 2015年07月25日 20:58
  • 6953

java多线程问题,线程交替执行

两个线程,一个打印1-100的奇数,一个打印1-100的偶数;要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环。 package threadtest; pu...
  • junli_chen
  • junli_chen
  • 2015年11月02日 11:12
  • 3454

两个线程交替执行

关于多线程编程请参考http://blog.csdn.net/morewindows/article/details/17488865 第二部分 本文实现两个线程的交替执行,一个线程输出奇数,另一个...
  • don_lvsml
  • don_lvsml
  • 2014年03月11日 11:57
  • 1754

面试题:两个线程交替运行若干次

用到的知识, 线程互斥:让两个线程不要同时往控制台输出。用的Reentrantlock。 线程同步:让一个线程独占使用System.out.print后,通知另一个线程开始打印。用的condition...
  • xd2008ck
  • xd2008ck
  • 2015年07月17日 10:08
  • 594

Java多线程交替执行任务

一:问题描述          生活中很多事情都是有顺序的交互进行着,比如100个人去做地铁,安检的只负责安;只有安检通过了,才能排队刷卡进站;进站了,在对应线路站下排队才能进站。这就是一个典型的多任...
  • lygsust
  • lygsust
  • 2016年09月13日 14:22
  • 1342

Java 创建两个线程,和主线程交替运行。

Java 创建两个线程,和主线程交替运行。
  • hoho_12
  • hoho_12
  • 2016年05月08日 20:29
  • 694

三个线程依次顺序执行

保证三个线程依次按顺序执行在有一些需求的情况下,我们需要三个线程依次按顺序执行,那么有人就会问了,为什么不把三个线程的run方法依次放到三个方法体中,然后依次执行,按顺序调用三个方法体,这样不是同样达...
  • eene894777
  • eene894777
  • 2017年07月11日 11:08
  • 3199

三个线程交替执行,c++实现

作为前一篇文章http://blog.csdn.net/don_lvsml/article/details/21003835 两个线程的交替执行,现在扩展为三个线程直接的交替执行。 代码如下: #pr...
  • don_lvsml
  • don_lvsml
  • 2014年03月11日 12:03
  • 837

java开启新线程的三种方法

见:http://blog.csdn.net/caidie_huang/article/details/52748460 见:http://blog.csdn.net/typename/article...
  • u011314442
  • u011314442
  • 2017年02月28日 09:12
  • 1732
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 之 三个线程交替执行任务
举报原因:
原因补充:

(最多只允许输入30个字)