首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 线程同步方式 waitnotify(两个线程交替执行的例子)

线程同步,就是线程之间互相协调,通过等待,唤醒等操作,避免线程之间同时操作同一个资源。简单的说就是线程之间互相协作,避免干扰了其他线程的工作。...Java 线程中,有多种方式可以实现线程同步,wait/notify 方法是最常用的一种方式。...实现 2 个线程,一个线程只能打印奇数,另一个线程只能打印偶数,现在需要打印出 1234…..100 这样的数列。 下面代码的一种实现方式,未有任何同步机制,所以两个线程不可能交替运行。...args[]) throws Exception { Object lock = new Object(); final boolean[] flag = {true};//交替执行标志位...true-线程1运行,false-线程2运行 FutureTask task1 = new FutureTask(() -> { for (int i = 0;

4.5K30
您找到你想要的搜索结果了吗?
是的
没有找到

奇偶数线程交替执行问题

一个面试题:两个线程,一个打印偶数,一个打印奇数,并且轮流打印,我们可以看到这种场景模式肯定是需要通过同步来实现, 实现通过的方式我们可以采用ReentrantLock来实现,也可以通过采用synchronized...来实现,下边就这两种方式进行 实现,平时感觉自己代码还是敲的少,以后还是要加强代码量; 方式一:通过synchronized来实现,使用该种方式实现,有两个要点记录,一个是:我们在没有使用锁对象的wait...() 方法时,调用其notify()没有影响,所以比如一段代码,上来就针对一个对象锁进行notify()是没有问题的; 两一个是:在对象锁的wait方法被唤醒后,在wait的地方继续执行,同时执行完代码块后优先拿到该对象锁...(num=1; num<=100; num+=2) { lock.lock(); System.out.println("wait前代码执行...InterruptedException e) { e.printStackTrace(); } System.out.println("wait后代码执行

64120

面试题-Synchronized实现两个线程交替打印

线程之间的通信有很多种方式,使用Synchronized实现两个线程交替打印,主要是利用Object对象的wait、notify方法,下面来看下代码: ? ? ?...解释一下上面的程序,首先定义一个内部类,实现say方法,say方法主要通过入参判断执行打印A还是打印B,进入后,如果是进去打印A分支,先锁住lock对象,然后判断是否需要打印,如果不需要则调用lock.wait...Object: wait() : 表示持有对象锁的线程准备释放对象锁权限,释放cpu资源并进入等待队列,,需要notify ,notifyAll才能唤醒。...notify() : 表示持有对象锁的线程准备释放对象锁权限,通知jvm唤醒某个竞争该对象锁的线程X。...notifyAll():表示持有对象锁的线程准备释放对象锁权限,通知jvm唤醒所有竞争该对象锁的线程

1K30

经典面试题-两个线程交替打印奇数和偶数

前提 今天下班时候和同事聊天偶然听到面试题“两个线程交替打印奇数和偶数”的实现,这里做一个复盘。 复盘 场景一:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用对象监视器实现。...场景二:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用JDK提供的并发类库实现。...这两个场景中,场景一是一种比较古老的同步方式,本质由JVM实现;场景二是JDK1.5引入JUC包之后简化了并发编程的前提下的更简便的实现。下面针对两个场景做对应的实现。...场景一 场景一中,线程A和线程B交替打印奇数和偶数,使用对象监视器实现,通俗来说:线程A或线程B只要有一者竞争锁成功,就打印++i,通知其他线程从等待集合中释放,然后自身线程加入等待集合并且释放锁即可。...thread1.start(); thread2.start(); Thread.sleep(Integer.MAX_VALUE); } } 执行后的输出结果

3.5K31

经典面试题-两个线程交替打印奇数和偶数

前提 今天下班时候和同事聊天偶然听到面试题“两个线程交替打印奇数和偶数”的实现,这里做一个复盘。 复盘 场景一:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用对象监视器实现。...场景二:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用JDK提供的并发类库实现。...这两个场景中,场景一是一种比较古老的同步方式,本质由JVM实现;场景二是JDK1.5引入JUC包之后简化了并发编程的前提下的更简便的实现。下面针对两个场景做对应的实现。...场景一 场景一中,线程A和线程B交替打印奇数和偶数,使用对象监视器实现,通俗来说:线程A或线程B只要有一者竞争锁成功,就打印++i,通知其他线程从等待集合中释放,然后自身线程加入等待集合并且释放锁即可。...thread1.start(); thread2.start(); Thread.sleep(Integer.MAX_VALUE); } } 执行后的输出结果

60420

面试题精选:两个线程按顺序交替输出1-100

具体题目是这样的,两个线程交替按顺序输出1-100,第一个线程只能输出偶数,第二线程输出奇数,想象下两个小孩轮流喊数。 ?...两个线程交替输出,这就意味着它俩是需要协同的,协同意味着二者之间要有信息传递,如何相互传递信息?...cnt导致的数据错误,另外,while (cnt.get()%2 == id也能保证只有单个线程才能进入while循环里执行,只有当前线程执行完inc后,下一个线程才能执行print,所以这个代码是可以满足我们交替输出的需求的...如果是三个线程交替输出呢?...生产者消费者 解析:两个线程按顺序交替输出本质上就是多线程之间的相互协同,而这个领域另外一个非常有名且更常见的问题就是生产者消费者问题,两个线程按顺序交替输出你可以认为是当生产者和单消费者的一种特殊情况

54920

线程间定制化通信--交替打印

线程间定制化通信 1、案例介绍 2、实现流程 3、代码实现 1、案例介绍   启动三个线程AA、BB、CC,线程AA打印5次,线程BB打印30次,线程CC打印15次,按照顺序循环10轮 2、实现流程...设置三个标志位, flag=1的时候,AA线程打印5次,同时修改标志位flag=2,通知BB线程 flag=2的时候,BB线程打印10次,同时修改标志位flag=3,通知CC线程 flag=...3的时候,CC线程打印15次,同时修改标志位flag=1,通知AA线程 3、代码实现 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock...loop); } //通知 flag=2; //修改标志位 c2.signal(); //通知BB线程...loop); } //通知 flag=3; //修改标志位 c3.signal(); //通知CC线程

44830

Python多线程并行执行两个函数,并获取线程返回结果

参考链接: 在Python中返回多个值 本人使用场景是,获取用户数据,然后插入到库中,并返回查询该用户的相关结果,实际上包含两个操作:  1.插入  无返回值 2.查询,有返回值。...这两个操作没有依赖关系,就是不插入也可以返回查询结果,为什么选择并行,是因为插入操作耗时,如果是串行计算会影响查询返回时间。 ...def two(i):     a = i+3     print('two', a)     return a def get_result(a):     threads = []  # 定义一个线程池...__name__)     t1 = threading.Thread(target=one)  # 建立一个线程并且赋给t1,这个线程指定调用方法one,并且不带参数     threads.append...(t)  # 把t1线程装到threads线程池里     # t2 = threading.Thread(target=two, args=(a,))     threads.append(t1)

2.5K20

一个核同时执行两个线程

可是厂里的老板还是嫌我们不够快,那天居然告诉我们要每个车间执行两个线程,实现八核十六线程,是要把我们的劳动力压榨到极致!...“我们几个管理层经过讨论,决定让你们一个车间由现在执行一个线程,变成执行两个线程!” [图源网络,侵删] 领导这话一出,会场窃窃私语此起彼伏。...我起身问到:“领导,这咱们一个车间怎么能执行两个线程呢,每个车间的寄存器只有一套,这用起来岂不是要乱掉?” “这个你不用担心,我们会给每个车间配两套寄存器!”...[图源网络,侵删] “还有,如果遇到资源闲置的情况,也可以同时执行两个线程的指令。比如一个线程执行整数运算指令,一个线程执行浮点数运算指令,就可以一起来,让工厂的计算资源充分用起来,别闲置。”...[图源网络,侵删] 不过毕竟计算资源还是只有一份,遇到两个线程都要使用同样的计算单元时,还是得要排队,还要花时间在两个线程之前的协调工作上,所以整体工作效率的根本没有2倍,绝大多数时候能提升个20%-30%

83621

一个核同时执行两个线程

可是厂里的老板还是嫌我们不够快,那天居然告诉我们要每个车间执行两个线程,实现八核十六线程,是要把我们的劳动力压榨到极致!...“我们几个管理层经过讨论,决定让你们一个车间由现在执行一个线程,变成执行两个线程!” ? 图源网络,侵删 领导这话一出,会场窃窃私语此起彼伏。...我起身问到:“领导,这咱们一个车间怎么能执行两个线程呢,每个车间的寄存器只有一套,这用起来岂不是要乱掉?” “这个你不用担心,我们会给每个车间配两套寄存器!” ?...图源网络,侵删 “还有,如果遇到资源闲置的情况,也可以同时执行两个线程的指令。比如一个线程执行整数运算指令,一个线程执行浮点数运算指令,就可以一起来,让工厂的计算资源充分用起来,别闲置。”...图源网络,侵删 不过毕竟计算资源还是只有一份,遇到两个线程都要使用同样的计算单元时,还是得要排队,还要花时间在两个线程之前的协调工作上,所以整体工作效率的根本没有2倍,绝大多数时候能提升个20%-30%

59310

线程交替打印数字—多种实现

# 多线程交替打印数字—多种实现 # 使用synchronized锁实现 public class Test { public static void main(String[] args)...奇数:99 偶数:100 通过加锁和notify()、wait()机制可以有效的实现两个线程分别打印奇数和偶数,但互斥锁始终会影响性能,效率不高。...LockSupport.unpark(thread2); } } } 那么程序将会发生死锁,因为两个线程都持有当前线程的许可,并没有等待到释放许可的执行...,当我们把断点放在奇数和偶数获取许可的代码段上时,会发现奇数线程先获取了许可,还没来得及执行if判断,偶数线程也获得了许可,此时程序没有任何打印。...奇数线程: 偶数线程: 此时我们采用jps命令找到当前线程的pid 之后采用jstack pid命令分析当前线程的堆栈信息,可以发现奇数线程和偶数线程都处于WAITING状态,他们都在等待对方释放锁或传递许可

47810
领券