通过Callable实现多线程

来源:互联网 发布:亿级别数据库 编辑:程序博客网 时间:2024/05/01 12:29

在Java.util.concurrent包下,相比较于通过实现Runnable接口的run方法来实现多线程,优点在于可以有返回值,可以抛出异常,因为run方法是void的,并且不能抛出异常,但是Callable的方式缺点在于较为繁琐。 
Callable的任务执行后可返回值,运行Callable任务可以拿到一个Future对象。Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检查计算的结果。通过Future对象可以了解任务的执行情况,可以取消任务的执行,还可以获取任务的执行结果。 
思路: 
(1)创建Callable实现类+重写call方法; 
(2)借助执行调度服务ExecutorService,获取Future对象 
ExecutorService ser = Executors.newFixedThreadPool(2); 
Future result = ser.submit(实现类对象) 
(3)获取result.get(); 
(4)停止服务ser.shutdownNow();

下面是一个小demo,龟兔赛跑的例子:

package multi_Thread;import java.util.concurrent.*;/** * 使用Callable创建线程 * Created by dd on 2016/6/4 0004. */public class demo01 {    public static void main(String[] args) throws ExecutionException, InterruptedException {//        创建线程        ExecutorService ser = Executors.newFixedThreadPool(2);        Race tortoise = new Race("乌龟",1000);        Race rabbit = new Race("兔子",500);        Future<Integer> result1 = ser.submit(tortoise);        Future<Integer> result2 = ser.submit(rabbit);        Thread.sleep(2000);        tortoise.setFlag(false);        rabbit.setFlag(false);//        获取值        Integer num1 = result1.get();        Integer num2 = result2.get();        System.out.println("乌龟"+num1);        System.out.println("兔子"+num2);//        停止服务        ser.shutdownNow();    }}class Race implements Callable<Integer>{    private String name;//名称    private long time;//延时时间    private boolean flag = true;    private int step = 0;    public Race() {    }    public Race(String name) {        super();        this.name = name;    }    public Race(String name, long time) {        super();        this.name = name;        this.time = time;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public long getTime() {        return time;    }    public void setTime(long time) {        this.time = time;    }    public boolean isFlag() {        return flag;    }    public void setFlag(boolean flag) {        this.flag = flag;    }    public int getStep() {        return step;    }    public void setStep(int step) {        this.step = step;    }    @Override    public Integer call() throws Exception {        while (flag){            Thread.sleep(time);            step++;        }        return step;    }}


原创粉丝点击