有一个任务队列,分别有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
- 有一个任务队列,分别有A、B、C三种类型的任务,设计一种功能,让三种任务分别按照x:y:z(具体比例可配置)的比例进行执行
- C#第十周任务之最后一项之创建一个如下的窗体,并在窗体上放置一个菜单、一个工具栏控件。菜单内容如第二个图所示。工具栏上有两个按钮,分别对应“打开文本文件”、“保存文本文件”。菜单和工具栏具体功能实现可
- Java 有两个任务A与B,多线程执行任务A完成后再继续执行任务B
- 输入(0,400,300)(地图名,x坐标,y坐标)这样的字符串数据,按照','分隔符提取,分别放到char [10],int a,int b中
- 分别输出a*x*x+b*x+c=0的三种情况的根
- 系统有很多任务,任务之间有依赖,比如B依赖于A,则A执行完后B才能执行
- 系统有很多任务,任务之间有依赖,比如B依赖于A,则A执行完后B才能执行
- 给你5个数a,b,c,d,k。x属于[a,b]y属于[c,d]。 问你有多少对(x,y)的公约数为k
- 一个简单的任务执行引擎设计
- 按照优先级的顺序执行任务
- 一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球队,现在四个球队进行比赛,用一条sql 语句显示所有可能的比赛组合.
- grunt的任务种类
- 练一练思维缜密程度。有程式xyz+yzz=532,其中x、y、z都是整数,用c++编写一个程序,求x、y、z分别代表什么数字
- 关于AsyncTask的一个小疑问:为什么任务执行有延迟?
- 题目描述:有这样一种数,它本身是一个整数的平方,其高三位和低三位也分别是一个整数的平方,求100000到999999之间的所有三平方的数据进行求解!
- 可激活的间隔任务执行器
- 两个带有线程池的方法分别执行两组线程任务,第二个方法需要等待第一组任务执行完毕
- 将等号前面的数字分别替换成x,y,z,w
- Python-11 字符串格式化
- 欧拉函数-LightOJ1007
- 【linux】close与shutdown
- C语言 实现两种排序方法
- 感谢 Flash 所做的一切
- 有一个任务队列,分别有A、B、C三种类型的任务,设计一种功能,让三种任务分别按照x:y:z(具体比例可配置)的比例进行执行
- android ndk 01 c语言 基本数据类型_输入输出_指针
- IntrospectorCleanupListener作用
- 0726 java入门
- laravel5.4 导入导出excel /.xls
- oracle与mysql数据库基本数据类型--介绍与区别
- RSA 算法原理(二)
- 并发编程--线程池ThreadPoolExecutor实现原理(二)
- java入门10- IO基础