利用多线程按顺序连续输出abc10次
多线程无论是在面试还是在公司都是经常会出现和用到的技术。今天我通过一道小题融合多项多线程技术。
这道题是利用多线程连续输出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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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);}}}
利用多线程按顺序连续输出abc10次
多线程无论是在面试还是在公司都是经常会出现和用到的技术。今天我通过一道小题融合多项多线程技术。
这道题是利用多线程连续输出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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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);}}}
发布评论