有两个子线程(线程2,线程3)和主线程,实现以下操作:
线程2先执行10次,然后 线程3执行20次,再由主线程执行30次,然后再让线程2执行10次,再让线程3执行20次…依次类推,执行10次。
程序如下:
package test;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ConditionTest {
public static void main(String[] args) {
final Bussiness bussiness = new Bussiness();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<10;i++){
bussiness.sub2(i);
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<10;i++){
bussiness.sub3(i);
}
}
}).start();
for(int i=0;i<10;i++){
bussiness.sub1(i);
}
}
}
class Bussiness{
Lock lock=new ReentrantLock();
/* 此处使用了三个Condition ,
原因:如果只使用一个Condition时,假如 线程 1 和 线程 2 都处于 await状态 的时候, 线程 3在signal()时 会随机唤醒 线程1,线程2中的一个,达不到顺序执行的要求*/
Condition condition1=lock.newCondition();
Condition condition2=lock.newCondition();
Condition condition3=lock.newCondition();
private int num=2;//用于表示正在执行的线程编码
public void sub2(int i){
lock.lock();
try{
while(num != 2){
try{
condition2.await();
}catch(Exception e){
e.printStackTrace();
}
}
for(int j=0;j<10;j++){
System.out.println("sub2 thread sequence of "+j+" loop of "+i);
}
num=3;
condition3.signal();
}finally{
lock.unlock();
}
}
public void sub3(int i){
lock.lock();
try{
while(num != 3){
try{
condition3.await();
}catch(Exception e){
e.printStackTrace();
}
}
for(int j=0;j<20;j++){
System.out.println("sub3 thread sequence of "+j+" loop of "+i);
}
num=1;
condition1.signal();
}finally {
lock.unlock();
}
}
public void sub1(int i){
lock.lock();
try{
while(num != 1){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=0;j<30;j++){
System.out.println("sub1 thread sequence of "+j+" loop of "+i);
}
num=2;
condition2.signal();
}finally{
lock.unlock();
}
}
}
结果如下:
sub2 thread sequence of 0 loop of 0
sub2 thread sequence of 1 loop of 0
sub2 thread sequence of 2 loop of 0
sub2 thread sequence of 3 loop of 0
sub2 thread sequence of 4 loop of 0
sub2 thread sequence of 5 loop of 0
sub2 thread sequence of 6 loop of 0
sub2 thread sequence of 7 loop of 0
sub2 thread sequence of 8 loop of 0
sub2 thread sequence of 9 loop of 0
sub3 thread sequence of 0 loop of 0
sub3 thread sequence of 1 loop of 0
sub3 thread sequence of 2 loop of 0
sub3 thread sequence of 3 loop of 0
sub3 thread sequence of 4 loop of 0
sub3 thread sequence of 5 loop of 0
sub3 thread sequence of 6 loop of 0
sub3 thread sequence of 7 loop of 0
sub3 thread sequence of 8 loop of 0
sub3 thread sequence of 9 loop of 0
sub3 thread sequence of 10 loop of 0
sub3 thread sequence of 11 loop of 0
sub3 thread sequence of 12 loop of 0
sub3 thread sequence of 13 loop of 0
sub3 thread sequence of 14 loop of 0
sub3 thread sequence of 15 loop of 0
sub3 thread sequence of 16 loop of 0
sub3 thread sequence of 17 loop of 0
sub3 thread sequence of 18 loop of 0
sub3 thread sequence of 19 loop of 0
sub1 thread sequence of 0 loop of 0
sub1 thread sequence of 1 loop of 0
sub1 thread sequence of 2 loop of 0
sub1 thread sequence of 3 loop of 0
sub1 thread sequence of 4 loop of 0
sub1 thread sequence of 5 loop of 0
sub1 thread sequence of 6 loop of 0
sub1 thread sequence of 7 loop of 0
……
太多了,复制了一部分。
分享到:
相关推荐
这个小程序写了三个线程是按照我的意愿来输出的,其中要利用lock锁与condition_t2.signal();
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
线程并发控制condition 互斥量 多线程写的:生产者、消费者问题
要在标准C++中使用多线程,可以使用类 thread,3条线程,我们可以直白一些,直接实现3个线程函数,在函数里面进行循环输出对应字符,每个循环控制10次即可;同时,要想控制输出顺序的话,最开始想到的方式是直接加一...
主要介绍了Python线程协作threading.Condition实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
需要3条线程输出不同的字符,分别为A、B、C,并且顺序要固定住:ABCABC...ABC[共10组],这样的情况下,只需要有一个计数器来统计字符的输出数量,通过这个计数器来对3取余,通过余数来当条件控制输出顺序即可。这个...
线程通信(Condition)实例,完整的代码文件,你只需要编译运行即可,就可以看看结果,然后分析。
比较实用,是操作系统很好的教辅资料。很详细的讲解。
主要介绍了Java编程中实现Condition控制线程通信,简单介绍了Java中控制线程通信的方法,以及对condition的解析和实例,具有一定参考价值,需要的朋友可以了解下。
或者说,如何保证在执行 x 的成员函数期间,对象 x 不会在另一个线程被析构?如何避免这种 race condition 是 C++ 多线程编程面临的基本问题,可以借助 tr1 中的 shared_ptr 和 weak_ptr 完美解决。这也是实现线程...
饥饿是指一个线程因为其他线程持续地占用资源而无法获得执行机会的现象。 Linux提供了多种线程同步机制,包括互斥锁(Mutexes)、条件变量(Condition Variables)、读写锁(Read-Write Locks)等。这些同步机制...
当多个线程都要去修改某一个共享数据的时候,需要对数据访问进行同步; 条件同步:threading.Condition 部分代码 import threading class Producer(threading.Thread): def __init__(self, t_name): ...
threading 模块提供的线程同步原语包括:Lock、RLock、Condition、Event、Semaphore等对象。 线程执行 join与setDaemon 子线程在主线程运行结束后,会继续执行完,如果给子线程设置为守护线程(setDaemon=True),...
在Linux中,线程同步是一种控制多个线程之间交互的方式,以确保它们按照预期的顺序执行和避免数据竞争。线程同步在多线程编程中非常重要,因为它可以确保各个线程之间的数据安全和正确性。 以下是Linux中常见的线程...
主要介绍了Python多线程编程(七):使用Condition实现复杂同步,本文讲解通过很著名的“生产者-消费者”模型来来演示在Python中使用Condition实现复杂同步,需要的朋友可以参考下
java多线程实现生产者和消费者 ,4种实现方式,分别为synchronizated,condition和lock,信号量,阻塞队列
线程池:JUC提供了Executor框架,可以方便地创建和管理线程池,实现任务的异步执行和线程的复用。 并发集合:JUC提供了一些线程安全的集合类,如ConcurrentHashMap、ConcurrentLinkedQueue等,可以在多线程环境下...