有一个任务队列,分别有A、B、C三种类型的任务,设计一种功能,让三种任务分别按照x:y:z(具体比例可配置)的比例进行执行

来源:互联网 发布:岁寒然后知松柏下一句 编辑:程序博客网 时间:2024/06/05 13:27

朋友的面试题,如下

有一个任务队列,分别有A、B、C三种类型的任务,设计一种功能,让三种任务分别按照x:y:z(具体比例可配置)的比例进行执行

解之。
主要的思路是lock+condition处理任务调度。

package test;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 有一个任务队列,分别有A、B、C三种类型的任务,设计一种功能, 让三种任务分别按照x:y:z(具体比例可配置)的比例进行执行 *  */public class Test {    /*     * 抽象具体化:比如有一个打印的功能,A任务打印A,以此类推 按照比例1:1:1执行,ABC 按照比例2:3:2执行,AABBBCC     * 需三个线程分别处理三个任务,线程任务调度机制lock/condition     */    static Lock lock = new ReentrantLock();    static Condition conA = lock.newCondition();    static Condition conB = lock.newCondition();    static Condition conC = lock.newCondition();    static int a = 0, b = 0, c = 0, count, sum = 0;    static Boolean flag = false;    public static void main(String[] args) {        count = 10; // 任务总数        a = 1; // A任务比例        b = 2; // B任务比例        c = 1; // C任务比例        new Thread(new TaskA()).start();        new Thread(new TaskB()).start();        new Thread(new TaskC()).start();    }    static class TaskA implements Runnable {        @Override        public void run() {            while (true) {                if (lock.tryLock()) {                    try {                        for (int i = 0; i < a; i++) {                            if (sum == count) {                                return;                            }                            System.out.print("A");                            sum++;                        }                        conB.signal();                        conA.await();                    } catch (InterruptedException e) {                        e.printStackTrace();                    } finally {                        lock.unlock();                    }                }            }        }    }    static class TaskB implements Runnable {        @Override        public void run() {            while (true) {                if (lock.tryLock()) {                    try {                        for (int i = 0; i < b; i++) {                            if (sum == count) {                                return;                            }                            System.out.print("B");                            sum++;                        }                        conC.signal();                        conB.await();                    } catch (InterruptedException e) {                        e.printStackTrace();                    } finally {                        lock.unlock();                    }                }            }        }    }    static class TaskC implements Runnable {        @Override        public void run() {            while (true) {                if (lock.tryLock()) {                    try {                        for (int i = 0; i < c; i++) {                            if (sum == count) {                                return;                            }                            System.out.print("C");                            sum++;                        }                        conA.signal();                        conC.await();                    } catch (InterruptedException e) {                        e.printStackTrace();                    } finally {                        lock.unlock();                    }                }            }        }    }}
阅读全文
0 0
原创粉丝点击