您的位置:首页 > 产品设计 > UI/UE

Java多线程--并发中集合的使用PriorityBlockingQueue

2017-09-07 14:05 645 查看


引言

在银行排队办理业务,通常会有一个VIP通道,让一些有VIP贵宾卡的优先办理业务,而不需要排队.这就是我们今天要讲的优先队列.


例子

假设在这么一个场景下,银行开始办理业务之前,已经来了20个客户,而且银行认为谁钱多,谁就优先办理业务.
首先创建一个
Human
类,它包括姓名和存款两个属性
public class Human {

private int maney;
private String name;
public Human(int maney, String name){
this.maney = maney;
this.name = name;
}

public int getManey() {
return maney;
}

public String getName() {
return name;
}

@Override
public String toString() {
return getName() + "[存款:"+getManey()+"]";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
之后再增加一个比较
Human
存款多少的类
HumanComparator

public class HumanComparator implements Comparator<Human>  {
@Override
public int compare(Human o1, Human o2) {
return o2.getManey() - o1.getManey();
}
}
1
2
3
4
5
6
再增加来排队的类 
ProducerRunnable

public class ProducerRunnable implements Runnable{
private static final String name = "明刚红李刘吕赵黄王孙朱曾游丽吴昊周郑秦丘";
private Random random = new Random();
private PriorityBlockingQueue<Human> queue;
public ProducerRunnable(PriorityBlockingQueue<Human> queue) {
this.queue = queue;
}

@Override
public void run() {
for(int i = 0; i < 20; i ++){
Human human = new Human(random.nextInt(10000), "小" + name.charAt(i));
queue.put(human);
System.out.println(human + " 开始排队...");
}
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
然后再增加办理业务的类 
ConsumerRunnable

public class ConsumerRunnable implements Runnable{

private PriorityBlockingQueue<Human> queue;
public ConsumerRunnable(PriorityBlockingQueue<Human> queue) {
this.queue = queue;
}

@Override
public void run() {
while (true){
Human take = queue.poll();
if (take == null){
break;
}
System.out.println(take + " 办理业务.");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ok,增加测试类
public class TestMain {

public static void main(String[] args) throws InterruptedException {

PriorityBlockingQueue<Human> queue = new PriorityBlockingQueue<>(200, new HumanComparator());
Thread thread = new Thread(new ProducerRunnable(queue));
thread.start();
thread.join();
new Thread(new ConsumerRunnable(queue)).start();
}
}
1
2
3
4
5
6
7
8
9
10
11

‘thread.join();’:先等20个来齐了,再开始办理业务额

运行结果:
小明[存款:9296] 开始排队...
小刚[存款:765] 开始排队...
小红[存款:333] 开始排队...
小李[存款:3912] 开始排队...
小刘[存款:5732] 开始排队...
小吕[存款:3714] 开始排队...
小赵[存款:8439] 开始排队...
小黄[存款:7330] 开始排队...
小王[存款:9535] 开始排队...
小孙[存款:1421] 开始排队...
小朱[存款:8308] 开始排队...
小曾[存款:5211] 开始排队...
小游[存款:8264] 开始排队...
小丽[存款:8383] 开始排队...
小吴[存款:7664] 开始排队...
小昊[存款:2715] 开始排队...
小周[存款:9760] 开始排队...
小郑[存款:8158] 开始排队...
小秦[存款:869] 开始排队...
小丘[存款:1806] 开始排队...
小周[存款:9760] 办理业务.
小王[存款:9535] 办理业务.
小明[存款:9296] 办理业务.
小赵[存款:8439] 办理业务.
小丽[存款:8383] 办理业务.
小朱[存款:8308] 办理业务.
小游[存款:8264] 办理业务.
小郑[存款:8158] 办理业务.
小吴[存款:7664] 办理业务.
小黄[存款:7330] 办理业务.
小刘[存款:5732] 办理业务.
小曾[存款:5211] 办理业务.
小李[存款:3912] 办理业务.
小吕[存款:3714] 办理业务.
小昊[存款:2715] 办理业务.
小丘[存款:1806] 办理业务.
小孙[存款:1421] 办理业务.
小秦[存款:869] 办理业务.
小刚[存款:765] 办理业务.
小红[存款:333] 办理业务.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

通过结果你会发现,有钱就是老大啊!!!小周跌二个来,结果却倒数第二个办理业务,只因为他是穷B.而小周*倒数第四个到,结果却第一个办理业务,有钱就是任性啊…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐