java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Callable实现多线程

Java通过Callable实现多线程

作者:kongshuchen

这篇文章主要介绍了Java通过Callable实现多线程,Callable的任务执行后可返回值,运行Callable任务可以拿到一个Future对象,Future表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并检查计算的结果,需要的朋友可以参考下

Callable实现多线程

在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;
    }
}

到此这篇关于Java通过Callable实现多线程的文章就介绍到这了,更多相关Callable实现多线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文