多线程循环打印 A B -- 面试题
2018-03-20 22:31
162 查看
多线程循环打印 A B
思路:利用wait 和 notify
利用lock
利用 condition
利用 synchronized (代码如lock 省略)
利用CAS的变量 AtomicInteger (代码同lock 省略)
wait和notify
代码如下public class LockDemo implements Runnable{ private Lock lock; //锁 private String letter; //打印字母 private int printStatus; //控制打印时机 private static AtomicInteger amount = new AtomicInteger(1); public LockDemo(Lock lock, String letter, int printStatus) { this.lock = lock; this.letter = letter; this.printStatus = printStatus; } public void run() { while(true){ lock.lock(); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } if(amount.get()%2 == printStatus){ amount.incrementAndGet(); System.out.println("当前线程:" + Thread.currentThread().getName() + " 字母:" + letter); }//其他情况下即使获取到锁 空跑 lock.unlock(); } } public static void main(String[] args) { Lock lock = new ReentrantLock(); LockDemo lockDemo1 = new LockDemo(lock, "A", 1); LockDemo lockDemo2 = new LockDemo(lock, "B", 0); new Thread(lockDemo1, "线程A").start(); new Thread(lockDemo2, "线程B").start(); } }
Lock
代码如下public class LockDemo implements Runnable{ private Lock lock; //锁 private String letter; //打印字母 private int printStatus; //控制打印时机 private static AtomicInteger amount = new AtomicInteger(1); public LockDemo(Lock lock, String letter, int printStatus) { this.lock = lock; this.letter = letter; this.printStatus = printStatus; } public void run() { while(true){ lock.lock(); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } if(amount.get()%2 == printStatus){ amount.incrementAndGet(); System.out.println("当前线程:" + Thread.currentThread().getName() + " 字母:" + letter); }//其他情况下即使获取到锁 空跑 lock.unlock(); } } public static void main(String[] args) { Lock lock = new ReentrantLock(); LockDemo lockDemo1 = new LockDemo(lock, "A", 1); LockDemo lockDemo2 = new LockDemo(lock, "B", 0); new Thread(lockDemo1, "线程A").start(); new Thread(lockDemo2, "线程B").start(); } }
Condition
代码如下public class ConditionTask implements Runnable { private Lock lock; private Condition condition; private String letter; public ConditionTask(Lock lock, Condition condition, String letter) { this.lock = lock; this.condition = condition; this.letter = letter; } public void run() { lock.lock(); while (true){ try { condition.signalAll(); //和Object.notifyAll类似 System.out.println("当前线程:" + Thread.currentThread().getName() + " 字母:" + letter); condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { 4000 Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); new Thread(new ConditionTask(lock, condition, "A"),"A").start(); new Thread(new ConditionTask(lock, condition, "B"),"B").start(); } }
如果是打印A B C 则需要多个状态变量进行控制
相关文章推荐
- Java多线程循环打印ABC 10次,可能是东半球最美解决方案了
- 多线程循环打印ABC10次
- 多线程循环打印
- 面试题--三个线程循环打印ABC10次的几种解决方法
- 面试题:100个小朋友围在一起,设定编号为1~100,依次按1,2,3,4,5,6,7,8,9循环报数,报到9的小朋友出圈,请写代码打印各个小朋友的出圈顺序?(Python实现)
- java多线程面试题:三个线程顺序打印ABC,重复10次
- 多线程之——实现循环打印"abc"
- 多线程按顺序依次打印ABCD---java多线程的一道经典面试题
- 多线程(至少三个线程)分别打印A、B、C,要求按ABC的顺序循环打印10次。
- 使用多线程手动写出循环打印ABABABAB...
- Java多线程面试题:子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50次
- Java多线程--三个线程分别打印a,b,c.请用多线程实现循环打印15次abc
- c++多线程实现循环打印ABC
- 【机试】华为2014校招机试:多线程循环打印十次ABC
- 多线程面试题:子线程循环10次,接着主线程循环100次;接着回到子线程循环10次,然后再回到主线程循环100次,如此交替50次。
- Java多线程 循环打印ABC 10次
- 多线程依次循环打印数据
- 面试题多线程轮流打印ABC初试
- 多线程打印日志面试题
- 一起做面试题--Java多线程交替打印