您的位置:首页 > 职场人生

多线程循环打印 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 则需要多个状态变量进行控制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: