java的Future设计模式实战
程序员文章站
2022-03-15 14:23:01
...
假设有个任务需要执行比较长的时间,而且有多个任务需要执行,某些任务之间可能有所关联,那么普通的java线程操作只能是将调度权交给CPU,由CPU决定某一时刻执行哪个任务,那么其余任务只能被阻塞起来,对于用户而言只能苦苦等待。然而Future接口提供了较好的方法来克服长时间等待的问题,即对于几个任务而言,如果第一个任务需要执行较长时间,而第二个任务和第一个任务之间又没有任何关联,那么Future接口的思路就是在第一个任务执行期间可以转而去执行第二个任务,体现出线程并发操作的思想。
以下是Future接口的简单实战,参照了一篇博客的代码进行了修改:
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
public class FutureCook {
public static void main(String[] args) throws InterruptedException, ExecutionException {
long startTime=System.currentTimeMillis();
System.out.println("想做木瓜牛奶汤和京东肉饼啦!");
Callable<Chuju> onlineShopping=new Callable<Chuju>() {
public Chuju call() throws InterruptedException {
System.out.println("网购厨具第一步:下单");
TimeUnit.SECONDS.sleep(30);
System.out.println("网购厨具第二步:等待送货");
TimeUnit.SECONDS.sleep(30);
System.out.println("网购厨具第三步:快递送达");
Chuju chuju=new Chuju("电饭煲","砧板","电饼铛");
System.out.println(chuju);
return chuju;
}
};
FutureTask<Chuju> task=new FutureTask<Chuju>(onlineShopping);
new Thread(task).start();
Thread.sleep(2000);
Shicai shicai=new Shicai("木瓜","银耳","牛奶","面粉","肉馅");
System.out.println("下厨第一步:食材到位");
System.out.println(shicai);
if(!task.isDone()) {
System.out.println("下厨第二步:厨具还没到,等待中……");
}
System.out.println("是否取消订单?(请在30秒内做出回复!回复true或者false)");
Thread.sleep(100);
Scanner in=new Scanner(System.in);
boolean name=in.nextBoolean();
if(name==true)
{
task.cancel(true);
System.out.println("已取消网购订单,去超市买厨具吧!");
System.out.println("总共用时"+(System.currentTimeMillis()-startTime)+"ms");
}
else {
Chuju chuju=task.get();
System.out.println("下厨第三步:厨具到位,开始展现厨艺");
cook(chuju,shicai);
System.out.println("总共用时"+(System.currentTimeMillis()-startTime)+"ms");
}
}
static void cook(Chuju chuju,Shicai shicai) {}
static class Chuju{
private String c1="null";
private String c2="null";
private String c3="null";
public Chuju(String c1, String c2, String c3) {
super();
this.c1 = c1;
this.c2 = c2;
this.c3 = c3;
}
@Override
public String toString() {
return "网购的厨具:"+c1+","+c2+","+c3;
}
}
static class Shicai{
private String s1;
private String s2;
private String s3;
private String s4;
private String s5;
public Shicai(String s1, String s2, String s3, String s4, String s5) {
super();
this.s1 = s1;
this.s2 = s2;
this.s3 = s3;
this.s4 = s4;
this.s5 = s5;
}
@Override
public String toString() {
return "准备的食材有:"+s1+","+s2+","+s3+","+s4+","+s5;
}
}
}
以下是程序运行结果:
具体可以看一下这篇博客