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

给出一个题目,有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&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;<&nbsp;loopNum;&nbsp;i++)&nbsp;{
outer.out1(i);
}
}
}).start();

//&nbsp;线程2
new&nbsp;Thread(new&nbsp;Runnable()&nbsp;{

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

//&nbsp;线程3
new&nbsp;Thread(new&nbsp;Runnable()&nbsp;{

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

}

}

class&nbsp;Outer&nbsp;{

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

int&nbsp;currentNo&nbsp;=&nbsp;1;

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

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

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

Java如何实现线程之间的互斥,布布扣,bubuko.com

时间: 2024-11-05 18:29:16

Java如何实现线程之间的互斥的相关文章

Java多个线程之间处理共享数据的方式

题目要求: 有4个线程,其中两个线程每次对x加1,另外两个每次对x减1,如何实现? 分析: x就是这4个线程要处理的共享数据,不同种线程有不同的处理方式,但操作的数据是共同的,联想到"窗口买票问题",但是卖票只是单纯的减. 所以,多个线程访问共享对象或数据的方式,先看,如果每个线程执行的代码相同,那么就可以使用同一个Runnable对象,这个对象中有被共享的数据,如买票问题. 如果每个线程执行的代码不同,肯定需要不用的Runnable对象,有两种方式实现这些不同的Runnable对象之

【Java】线程并发、互斥与同步

网络上对于线程的解析总是天花龙凤的,给你灌输一大堆概念,考研.本科的操作系统必修课尤甚,让你就算仔细看完一大堆文章都不知道干什么. 下面不取网站复制粘贴,在讲解自己的Java线程并发.互斥与同步之前先给大家解构操作系统书中那些给出书者为了出书者而写的废话到底是什么意思. 大神们如果只想看程序,可以自行跳过,反正我的文章从来新手向,不喜勿看. 一.线程的基本概念 其实线程的概念非常简单,多一个线程,就多了一个做事情的人. 比如搬东西,搬10箱货物,这就是所谓的一个进程,一个人,就是所谓的一个线程,

java并发系列(二)-----线程之间的协作(wait、notify、join、CountDownLatch、CyclicBarrier)

在java中,线程之间的切换是由操作系统说了算的,操作系统会给每个线程分配一个时间片,在时间片到期之后,线程让出cpu资源,由其他线程一起抢夺,那么如果开发想自己去在一定程度上(因为没办法100%控制它)让线程之间互相协作.通信,有哪些方式呢? wait.notify.notifyAll 1.void wait( ) 导致当前的线程等待,直到其他线程调用此对象的notify( ) 方法或 notifyAll( ) 方法 2.void wait(long timeout) 导致当前的线程等待,直到

Android多线程研究(3)——线程同步和互斥及死锁

为什么会有线程同步的概念呢?为什么要同步?什么是线程同步?先看一段代码: package com.maso.test; public class ThreadTest2 implements Runnable{ private TestObj testObj = new TestObj(); public static void main(String[] args) { ThreadTest2 tt = new ThreadTest2(); Thread t1 = new Thread(tt,

JAVA多线程之线程间的通信方式

一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. 参考示例: public class MyObject { synchronized public void methodA() { //do something.... } synchronized public void methodB()

多进程之间的互斥信号量的实现(Linux和windows跨平台)

最近工作中遇到了一些关于文件读取权限的问题.当一个程序中对一个固定名称的文件做了读写的操作的时候,外界通过并发式的调用这个应用的时候,可能存在多个进程同时去操作这个文件,这个时候可能会造成调用失败的问题.所以这个时候,在操作文件之前就应该给该操作加锁,遵循先来先行,后来等待的效果,从而保证各个进程都能够正常的执行自己的功能. 对于单个进程来说,进程内部的多个线程之间实现互斥的功能就方法很多,临界区(CriticalSection),互斥量(Mutex),信号量(Semaphore),事件(Eve

Java 复习 —— 锁以及线程之间的通讯

1.Lock 1)1.5版本之后出现,java.util.concurrent.locks.Lock 2) Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象. 锁是控制多个线程对共享资源进行访问的工具.通常,锁提供了对共享资源的独占访问.一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁.不过,某些锁可能允许对共享资源并发访问,如 ReadWriteL

Java多线程——线程之间的同步

Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,以及如何使用synchronized关键字和volatile关键字. 部分内容来自以下博客: https://www.cnblogs.com/hapjin/p/5492880.html https://www.cnblogs.com/paddix/p/5367116.html https://www.cnblogs.com/paddix/p/5428507.html https://www.cnblogs.com/liu

Java多线程之~~~使用Exchanger在线程之间交换数据

在多线程中,两个线程之间交换数据是非常常见的情况,我们可以使用公共的数据结构,同样,Java也提供了很好 的类供我们使用,那就是Exchanger类,这个类可以帮助我们在两个线程之间同步数据结构,下面我们以这个类再来实 现一遍生产者消费者模型,貌似这个模型已经被写烂了. package com.bird.concursey.charpet5; import java.util.List; import java.util.concurrent.Exchanger; public class Pr