关闭

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

标签: javathreadclassimportstring任务
3578人阅读 评论(1) 收藏 举报
分类:
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();
				}
	}
}
*/

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:628880次
    • 积分:7213
    • 等级:
    • 排名:第3213名
    • 原创:183篇
    • 转载:80篇
    • 译文:0篇
    • 评论:123条
    文章分类
    最新评论