题目:
有A、B、C 三个线程,A线程 输出“A”,B线程 输出“B”,C线程 输出“C”,要求同时启动3个线程,按照顺序输出“ABC”,循环10次,请使用代码实现。
这里贴一下我自己写的代码,使用Synchronized,wait,notify实现:
最后打印完结束程序这里用的System.exit(0),看了别人的答案,感觉每个线程中加for循环10次去获取锁,这样应该更合适一些。
package JUCTest;
import java.security.cert.TrustAnchor;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @title: PrintABC
* @package JUCTest
* @description: 三个线程循环打印A,B,C
* @author:
* @date: 2020/06/20 01:13 13:13
* @version: V1.0
*/
public class PrintABC {
public static void main(String[] args) {
final MyLock myLock = new MyLock();
myLock.val="A";
new Thread(new MyRunnable("A",myLock)).start();
new Thread(new MyRunnable("B",myLock)).start();
new Thread(new MyRunnable("C",myLock)).start();
while (true){
}
}
}
class MyRunnable implements Runnable{
private String name;
private MyLock lock;
private static HashMap<String,String> map =new HashMap<String, String>();
static {
map.put("A","B");
map.put("B","C");
map.put("C","A");
}
public MyRunnable(String name,MyLock lock){
this.name=name;
this.lock=lock;
}
public void run() {
while (true){
synchronized (lock){
if(lock.val.equals(name)) {
System.out.print(lock.val);
lock.val=map.get(name);
if(lock.count.get()==30) System.exit(0);
lock.count.incrementAndGet();
}
// else if(lock.val.equals("B")){
// System.out.println(lock.val);
// lock.val="C";
// }
// else if(lock.val.equals("C")){
// System.out.println(lock.val);
// lock.val="A";
// }
lock.notifyAll();
try {
lock.wait();
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class MyLock{
String val ="A";
AtomicInteger count =new AtomicInteger(1);
}
贴一下看过的题解博客: