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

奇偶数线程交替执行问题

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

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

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

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

线程间定制化通信 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

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

# 多线程交替打印数字—多种实现 # 使用synchronized锁实现 public class Test { public static void main(String[] args)...LockSupport.unpark(thread2); } } } 那么程序将会发生死锁,因为两个线程都持有当前线程的许可,并没有等待到释放许可的执行...,当我们把断点放在奇数和偶数获取许可的代码段上时,会发现奇数线程先获取了许可,还没来得及执行if判断,偶数线程也获得了许可,此时程序没有任何打印。...奇数线程: 偶数线程: 此时我们采用jps命令找到当前线程的pid 之后采用jstack pid命令分析当前线程的堆栈信息,可以发现奇数线程和偶数线程都处于WAITING状态,他们都在等待对方释放锁或传递许可...所以正确的写法应该在if判断内,当打印之后便会阻塞当前线程,由于数字已经打印,再次循环时便会进入到else的判断逻辑,即当前线程发现不是属于自己该打印的数字就会尝试唤醒另一个线程

47710

面试题-使用线程交替打印奇数偶数

需要使用两个线程交替打印奇偶数。...            semaphoreOdd.acquire();//获取信号量 semaphoreOdd在初始化的时候被获取了信号量所以这里被阻塞了,所以会先执行下面的奇数线程...//这里阻塞,等待偶数线程释放信号量 //再次申请获取奇数信号量,需要等偶数线程执行完然后释放该信号量,不然阻塞...虽然这个异常不在这个问题的考虑范围内 但是可以使用finally 来包裹释放锁资源 同步锁打印 让两个线程使用同一把锁。交替执行 。 判断是不是奇数 如果是奇数进入奇数线程执行打印并加一。...然后线程释放锁资源。然后让该线程等待 判断是不是偶数,如果是偶数进入偶数线程执行打印并加一。然后线程释放锁资源。

1.3K21

Rust并发控制之Semaphore-两线程交替打印

接下来,我们尝试用通过用它来实现两个线程交替打印 1 和 2,来更直观了解如何使用 semaphore Rust std 库中没有正式发布的 semaphore(std::sync::Semaphore...原因很简单,我们只是约束了令牌同时只能有一个线程获取到,但是没有约束谁先谁后啊。所以其实没有实现交替打印。 怎么交替打印呢?...要控制顺序,我们可以让每个线程所持有的 semaphore 里的令牌时动态增加和消耗,然后一个令牌桶数量的增加滞后于另一个。...(t1, t2).unwrap(); } 通过两个动态的令牌桶(semaphore)线程执行顺序就能交替执行了。...推荐阅读 掌握Rust:从零开始的所有权之旅 Rust并发控制之Condvar-两线程交替打印 聊聊共享所有权之Rc和Arc 如果有用,点个 在看,让更多人看到 外链不能跳转,戳 阅读原文 查看参考资料

27030

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

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

1K30

java 主线程等待子线程执行完后再执行

这里记录一下下面这种情况:主线程需要等待多个子线程执行完后再执行。...: 主线程正在执行前:main 子线程正在执行:Thread-0 子线程正在执行:Thread-1 子线程正在执行:Thread-2 子线程正在执行:Thread-3 子线程正在执行:Thread-4...子线程正在执行:Thread-5 子线程正在执行:Thread-6 子线程正在执行:Thread-7 子线程正在执行:Thread-8 主线程正在执行后:main 子线程正在执行:Thread-9 可以看到...: 主线程正在执行前:main 子线程正在执行:Thread-0 子线程正在执行:Thread-1 子线程正在执行:Thread-2 子线程正在执行:Thread-3 子线程正在执行:Thread-4...子线程正在执行:Thread-5 子线程正在执行:Thread-6 子线程正在执行:Thread-7 子线程正在执行:Thread-8 子线程正在执行:Thread-9 主线程正在执行后:main 或者用

4.5K20
领券