多线程无论是在面试还是在公司都是经常会出现和用到的技术。今天我通过一道小题融合多项多线程技术。
这道题是利用多线程连续输出ABC十次。首先,我先说明解决这道题的方法不唯一,而我只提供一种,其他方法希望读者自己尝试。第一步需要定义三个线程,继承Runnablej接口,重写其中方法并且加上synchronized锁,(synchronized是一种互斥同步锁,作用是在多线程程序中一次只能运行一个线程,并且同步更改),只用synchronized还不够吗,我们需要volatile关键字修饰一个变量用来控制线程执行顺序(volatile可以保证线程间的可见性和有序性,但是不能保证原子性,所以需要在合适的场景下才能保证线程安全)。通过java中的wait()方法(使用wait()方法后需要启动notify()方法才能重启线程)控制线程间隔。
public class ThreadABC {
private volatile static int flag = 1;
public static void main(String[] args) throws IOException, InterruptedException{
Thread threada = new Thread(new Runnable() {
@Override
public synchronized void run() {
try {
while(flag!=1) {
wait();
}
System.out.println("A");
flag = 2;
notify();
}catch (Exception e) {
e.printStackTrace();
}
}
});
Thread threadb = new Thread(new Runnable() {
@Override
public synchronized void run() {
try {
while(flag!=2) {
wait();
}
System.out.println("B");
flag =3;
notify();
}catch (Exception e) {
e.printStackTrace();
}
}
});
Thread threadc = new Thread(new Runnable() {
@Override
public synchronized void run() {
try {
while(flag !=3) {
wait();
}
System.out.println("C");
flag = 1;
notify();
}catch (Exception e) {
e.printStackTrace();
}
}
});
ExecutorService pool = Executors.newCachedThreadPool();
for(int i = 0;i<10;i++) {
pool.execute(threada);
pool.execute(threadb);
pool.execute(threadc);
}
}
}