美文网首页
ABC三个线程如何保证顺序执行

ABC三个线程如何保证顺序执行

作者: sunpy | 来源:发表于2018-11-28 15:48 被阅读311次

介绍

最近看看多线程练习题,练习下多线程,这道题:ABC三个线程如何保证顺序执行。三个线程同时启动,然后按照顺序执行,每个线程执行10次。

思路

首先想到了等待队列Condition唤醒部分线程,使用ReentrantLock进行加锁。

初始版实现

/**
 * @description A\B\C三个线程顺序执行10次
 * 
 * @author sunpy
 * @date 2018年11月28日  下午2:23:45
 */
public class MyTest {

    static class MyTask {
        private static ReentrantLock rl = new ReentrantLock();
        private static Condition conditionA = rl.newCondition();
        private static Condition conditionB = rl.newCondition();
        private static Condition conditionC = rl.newCondition();
        private static int number = 0;
    
        public void execute() {
            rl.lock();
            
            try {
                while (number < 30) {
                    if (number % 3 == 0) {
                        System.out.println(Thread.currentThread().getName() + " - " + number);
                        number++;
                        conditionB.signal();
                        conditionA.await();
                    }
                    
                    if (number % 3 == 1) {
                        System.out.println(Thread.currentThread().getName() + " - " + number);
                        number++;
                        conditionC.signal();
                        conditionB.await();
                    }
                    
                    if (number % 3 == 2) {
                        System.out.println(Thread.currentThread().getName() + " - " + number);
                        number++;
                        conditionA.signal();
                        conditionC.await();
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                rl.unlock();
            }
        }
    }
    
    
    public static void main(String[] args) {
        final MyTask myTask = new MyTask();
        new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.execute();
            }
        }, "A").start();
        
        new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.execute();
            }
        }, "B").start();
        
        new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.execute();
            }
        }, "C").start();
        
    }
}

说明:通过余数判断来执行,需要循环30次,有点不合理。想了下,执行10次,循环10次,但是让线程按照ABC执行就可以了。根据这个想法写出了改进版。

改进版实现

/**
 * @description A\B\C三个线程顺序执行10次
 * 
 * @author sunpy
 * @date 2018年11月28日  下午2:23:45
 */
public class MyTest {

    static class MyTask {
        private static ReentrantLock rl = new ReentrantLock();
        private static Condition conditionA = rl.newCondition();
        private static Condition conditionB = rl.newCondition();
        private static Condition conditionC = rl.newCondition();
    
        public void execute(String flag) {
            rl.lock();
            
            try {
                for (int i = 1 ; i <= 10 ; i++) {
                    if ("A".equals(flag)) {
                        System.out.println(Thread.currentThread().getName() + " - " + i);
                        conditionB.signal();
                        conditionA.await();
                    }
                    
                    if ("B".equals(flag)) {
                        System.out.println(Thread.currentThread().getName() + " - " + i);
                        conditionC.signal();
                        conditionB.await();
                    }
                    
                    if ("C".equals(flag)) {
                        System.out.println(Thread.currentThread().getName() + " - " + i);
                        conditionA.signal();
                        conditionC.await();
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                rl.unlock();
            }
        }
    }
    
    
    public static void main(String[] args) {
        final MyTask myTask = new MyTask();
        new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.execute("A");
            }
        }, "A").start();
        
        new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.execute("B");
            }
        }, "B").start();
        
        new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.execute("C");
            }
        }, "C").start();
    }
}

相关文章

  • ABC三个线程如何保证顺序执行

    介绍 最近看看多线程练习题,练习下多线程,这道题:ABC三个线程如何保证顺序执行。三个线程同时启动,然后按照顺序执...

  • ABC三个线程如何保证顺序执行,即顺序打印ABC

    最开始因为获取的lockSeq不是最新的,一直没有正确的结果,导致误判notifyAll只会唤醒一个线程,通过对照...

  • Java 线程 - 线程顺序执行

    1 三个线程顺序打出abc 2 三个线程顺序打出abc 30次[Semaphore] 3 三个线程顺序打出abc ...

  • iOS多线程(面试题)汇总分享

    目录 实际问题 子线程同时执行ABC三个同步任务、全部执行完成再在子线程执行三个同步任务EDF。 上一题中的ABC...

  • 并发

    保证多线程的顺序执行 方式1:通过join方法保证多线程的顺序join作用:让主线程等待子线程结束后才能继续运行 ...

  • 调用了join方法之后,线程是如何被唤醒的

    1 背景 在进行面试的时候,当被问及如何保证线程的执行顺序的时候,大部分人可能都想到使用join保证顺序。面试官微...

  • 线程异步转同步

    学习笔记,仅供自己参考,如有不对欢迎指正 5.T1、T2、T3三个线程,如何保证它们顺序执行?也就是异步转同步的方...

  • 控制线程的执行顺序

    在Java多线程中通常来说,在执行线程时,如果要保证线程的执行顺序,可以使用join和Executorservic...

  • Java并发编程(一)如何保证线程顺序执行

    只要了解过多线程,我们就知道线程开始的顺序跟执行的顺序是不一样的。如果只是创建三个线程然后执行,最后的执行顺序是不...

  • ExecutorService_NewSingleThreadE

    任务是顺序执行的,SingleThreadExecutor得到的是一个单个的线程,这个线程会保证你的任务执行完成,...

网友评论

      本文标题:ABC三个线程如何保证顺序执行

      本文链接:https://www.haomeiwen.com/subject/oqvsqqtx.html