任务描述
在日常工作生活中,无论哪个行业都会设置一些Svip用户,Svip用户具有超级优先权,在办理业务时,Svip用户具有最大的优先级。
本案例要求编写一个模拟Svip优先办理业务的程序,在正常的业务办理中,插入一个Svip用户,优先为Svip用户办理业务。本案例在实现时,可以通过多线程实现。
实现
使用Thread的join方法实现
模拟普通用户正在排队有序办理业务时,SVip突然插队的情况
需要一个Svip的类,里面有一个isContinue的标记,当isContinue为true时表示有Svip插队
然后重写Runnable的run方法,模拟Svip开始办理业务
public class SVip implements Runnable {
private boolean isContinue;
public boolean isContinue() {
return isContinue;
}
public void setContinue(boolean aContinue) {
isContinue = aContinue;
}
public SVip() {
}
public SVip(boolean isContinue) {
this.isContinue = isContinue;
}
@Override
public void run() {
synchronized (this){
System.out.println("此时来了一位SVip用户");
System.out.println("SVip用户开始办理业务");
System.out.println("SVip用户办理倒计时");
for (int i = 10; i >=0 ; i--) {
System.out.println(i+"秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i==0){
break;
}
}
}
}
}
然后写一个普通的用户类表示正常情况的排队办理业务
正常排队时,如果传了一个Svip过来,sVip.isContinue()为true执行,并且使用join方法保证不被普通用户抢,Svip办理完业务后又将sVip.isContinue() set为false,继续正常执行。
public class User implements Runnable {
SVip sVip = new SVip(true);
Thread thread = new Thread(sVip);
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("办理用户窗口在正常排队中");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (sVip.isContinue()){
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
sVip.setContinue(false);
}
}
}
}
然后再写一个测试类进行测试
public class SVipTest {
public static void main(String[] args) {
User user = new User();
Thread thread1 = new Thread(user);
thread1.start();
}
}
最后可以完美实现需求