文档章节

Java如何实现线程之间的互斥

零下三度
 零下三度
发布于 2014/06/12 00:08
字数 510
阅读 203
收藏 18

     给出一个题目,有3个线程,我希望线程1向控制台输出3行信息后,线程2向控制台输出6行信息,接下来是线程3输出10行信息到控制台,如此循环10次。在一个线程输出信息的时候,其他线程不能产生干扰。

package com.concurrent.condition;

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

/*==================================
 * 描述:有3个线程,线程1连续输出3次,然后让线程2连续输出6次,接下来线程3连续输出10次。依次循环10次
 * 作者:零下三度
 ==================================*/
public class ConditionExample {

	public static void main(String[] args) {
		final Outer outer = new Outer();
		final int loopNum = 10;
		// 线程1
		new Thread(new Runnable() {

			@Override
			public void run() {
				for (int i = 1; i < loopNum; i++) {
					outer.out1(i);
				}
			}
		}).start();

		// 线程2
		new Thread(new Runnable() {

			@Override
			public void run() {
				for (int i = 1; i < loopNum; i++) {
					outer.out2(i);
				}
			}
		}).start();

		// 线程3
		new Thread(new Runnable() {

			@Override
			public void run() {
				for (int i = 1; i < loopNum; i++) {
					outer.out3(i);
				}
			}
		}).start();

	}

}

class Outer {

	Lock lock = new ReentrantLock();
	Condition condition1 = lock.newCondition();
	Condition condition2 = lock.newCondition();
	Condition condition3 = lock.newCondition();

	int currentNo = 1;

	// 线程1的输出方法
	public void out1(int loopNum) {
		try {
			lock.lock();
			while (currentNo != 1) {
				try {
					condition1.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int i = 0; i < 3; i++) {
				System.out.println("this Thread1 outer no." + i + " ; loop="
						+ loopNum);
			}
			currentNo = 2;//标志态置换为线程2可以输出的标志
			condition2.signal();// 通知线程2开始了
		} finally {
			lock.unlock();
		}
	}

	//线程2的输出方法
	public void out2(int loopNum) {
		try {
			lock.lock();
			while (currentNo != 2) {
				try {
					condition2.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int i = 0; i < 6; i++) {
				System.out.println("this Thread2 outer no." + i + " ; loop="
						+ loopNum);
			}
			currentNo = 3;//标志态置换为线程3可以输出的标志
			condition3.signal();//通知线程3
		} finally {
			lock.unlock();
		}
	}

	//线程3的输出方法
	public void out3(int loopNum) {
		try {
			lock.lock();
			while (currentNo != 3) {
				try {
					condition3.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int i = 0; i < 10; i++) {
				System.out.println("this Thread3 outer no." + i + " ; loop="
						+ loopNum);
			}
			currentNo = 1;//标志态置换为线程2可以输出的标志
			condition1.signal();//通知线程1
		} finally {
			lock.unlock();
		}
	}
}


© 著作权归作者所有

零下三度
粉丝 8
博文 11
码字总数 13153
作品 0
朝阳
程序员
私信 提问
Java轻量级锁原理详解(Lightweight Locking)

大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意。 原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖操作系统互斥(mutex)来实现...

serenity
2015/08/11
0
0
Java基础加强之多线程篇 - 线程创建与终止、互斥、通信、本地变量

线程创建与终止 线程创建 Thread类与 Runnable 接口的关系 Thread类与 Runnable接口 都位于java.lang包中。 从上面我们可以看出,Runnable接口中只定义了run()方法,Thread类实现了Runnable ...

Java高级架构师
2018/12/12
0
0
操作系统中的互斥和JVM中的互斥

前几天再写synchronized的JVM实现时候,想起如果是2个线程同时想获得对象锁,即修改对象头的lock位时候,同时发现对象锁可用,同时修改lock的值,天了噜想想真是太可怕,想解决互斥却在解决方...

陈二C
2015/07/10
0
4
面试系列-并发编程72道面试题及答案

话不多说直接上题,篇幅限制,文末有答案 1.Java中守护线程和本地线程区别 2.线程与进程的区别 3.什么是多线程中的上下文切换 4.死锁与活锁的区别,死锁与饥饿的区别 5.Java中用到的线程调度...

Java邵先生
01/29
0
0
Java并发编程面试必备的知识点!

相信不用我说,大家也都知道掌握并发编程对于一个 Java 程序员的重要性。但相对于其他 Java 基础知识点来说,并发编程更加抽象,涉及到的知识点很多很零散,实际使用也更加麻烦。以至于很多人...

架构师技术联盟
03/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java设计模式-模板方法模式

定义 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changi......

别打我会飞
33分钟前
2
0
百度T8架构师细谈Java架构进阶扫盲清单!(附图文)

普通程序员写代码叫编码,而架构师写代码就叫架构设计。这是因为他们在编码时考虑的角度完全不同。普通程序员只需要考虑如何实现功能,而优秀的程序员(预备架构师)却更多考虑性能、可读性、...

编辑之路
36分钟前
1
0
lombok的一个踩坑记录

lombok的类如下所示: package com.divx.service.model.task;import com.divx.service.model.BaseTypeMedia;import lombok.Data;/** * @author wuzhilang * @Title: QuestionResult ......

无知的小狼
今天
2
0
如何使用markdown

我没有导入相应的包 这个用的还是有些问题 而且显示的时候格式问题还没解决 <div class="blog_editor" style="margin: 0 auto;width:60%;height:1000px;background-color: white;"> <div s......

南桥北木
今天
4
0
纯手写SpringBoot框架之注解方式启动SpringMVC容器

使用Java语言创建Tomcat容器,并且通过Tomcat执行Servlet,接下来,将会使用Java语言在SpringBoot创建内置Tomcat,使用注解方式启动SpringMVC容器。 代码实现。 1.pom.xml文件,需要依赖的jar...

Java老王
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部