解题思路 实现一个类OddEven 有一个打印奇数的方法,有一个打印偶数的方法. 类中有一个volatile变量 ,用来控制当前状态是该哪个方法打印. 方法中打印每个数前首先判断volatile变量的状态,不该自己打印就使用Thread.yield()让出CPU,该自己就打印并调换状态. 在主函数中,两个线程共享一个OddEven实例,并调用打印奇数的方法或打印偶数的方法. 本质是线程的协作. 代码 class OddEven { int n; boolean flag = true;// fl…
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Solution { private int start = 1; /** * 对flag的写入虽然加锁保证了线程安全,但由于读取时不是volatile所以可能会读到旧值 */ private volatile boolean flag = false; /** * 重入锁 */ private…
背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交替打印,输出结果为12A34B...........5152Z. 3.请用多线程方式实现. 这种只有两个线程交替打印数据的题目其实相对还是比较简单的,如果利用传统线程无非就是synchronized(线程互斥)与wait(),notify()的问题. 今天不用传统线程解决这个问题,我们用Java 1…
引言 在日常工作生活中,可能会有用时几个人或是很多人干同一件事,在java编程中,同样也会出现类似的情况,多个线程干同样一个活儿,比如火车站买票系统不能多个人买一到的是同一张票,当某个窗口(线程)在卖某一张票的时候,别的窗口(线程)不允许再卖此张票了,在此过程中涉及到一个锁和资源等待的问题,如何合理正确的让线程与线程在干同一件事的过程中,不会抢资源以及一个一直等待一个一直干活的状况,接下来就聊一下多线程的等待唤醒以及切换的过程,在此就以A和B两个线程交替打印奇偶数的例子为例,代码如下: pack…
多线程下,两个线程交替打印0 -100,使用wait()和notify() public class ThreadTest{ private static final Object lock = new Object(); static class ThreadA extends Thread{ @Override public void run() { for (int i = 0; i < 100; i = i+2) { synchronized (lock){ lock.notify();…
方案一:import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; /** * created by cjy * desc: lock and condition */public class Test100_01 { private static Lock lock = new Reentra…
今天看到一个题:两个线程交替打印奇数和偶数,即一个线程打印奇数,另一个打印偶数,交替打印从1到100.想了下有多重实现方法. wait和notify方法: public class OddEven { private static int i = 1; private static Object o = new Object(); private static class MyThread extends Thread { MyThread(String name) { super(name);…
使用Java实现三个线程交替打印0-74 题目分析 三个线程交替打印,即3个线程是按顺序执行的.一个线程执行完之后,唤醒下一个线程,然后阻塞,等待被该线程的上一个线程唤醒.执行的顺序是一个环装的队列 0->1->2->0 ....->0->1->2 实现思路 由于三个线程一次只能有一个在打印数字,所以需要用一个锁来进行同步.但是在打印时要保证顺序就要求 一个线程打印完之后只能唤醒它的下一个线程,而不是唤醒所有的线程.这就要求给每一个线程都有一个自己的状态来控制阻塞和唤醒…
方法一:传统的线程方法import org.apache.log4j.Logger; /** * 两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象.<br/> * 锁是上在代表要操作的资源的类的内部方法中,而不是线程代码中.<br/> * * 样例:<br/> * 1).主线程执行10次循环,接着子线程执行100此循环:<br/> * 2).重复1)操作50次,结束.<br/> * * @author wangzhu *…
题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交替打印,输出结果为12A34B...........5152Z. 3.请用多线程方式实现. 实现思路:通过锁(synchronized) 与wait(),notifyAll()的 或者lock.await().signal()来实现,废话不多说,直接上代码: import java.util.concurrent.locks.Condition; import java.util.concurrent.loc…