欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

实现多线程的第三种方式

程序员文章站 2022-07-10 18:12:35
...

多线程前两种方式的缺点

  1. 没有返回值
  2. 不支持泛型
  3. 异常必须处理

实现多线程的第三种方式

实现Callable接口,重写call方法
这种方法将前两种方式的缺点全部弥补

Callable功能更加强大

  1. Futrue接口位于java.util.concurrent包内,可以对具体Runnable,Callable任务的执行结果进行取消(cancel方法,尝试取消执行这个任务),查询是否完成(isDone方法) ,获取结果(get方法,等待完成,然后检索它的结果)等
  2. FutrueTask是Futrue接口的唯一实现类
  3. FutureTask同时实现了Runnable,Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值

示例代码:

使用线程随机显示五个水果种类
创建一个实现类:

package callable;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {

    @Override
    public String call() throws Exception {
        String [] str = {"apple","banana","orange","pear","grape"};
        int index = (int)(Math.random()*5);//返回的是一个0到4之间的数
        return str[index];
    }
}

测试类:

package callable;

import java.util.concurrent.FutureTask;

public class Test {
    public static void main(String[] args) throws  Exception {
        //1.创建任务
        MyCallable call = new MyCallable();
        //2. 交给任务管理器
        /**
         * 任务管理器是一个实现类,实现了RunnableFutrue接口
         * RunnableFutrue是Futrue与Runnable接口的子接口
         */
        FutureTask<String> task = new FutureTask<>(call);   //可以看成是Runnable接口的实现类
        //创建代理类并启动线程
        Thread t = new Thread(task);
        t.start();
        System.out.println("获取结果:"+task.get());
        //判断任务是否执行完成
        System.out.println("任务是否执行完成:"+task.isDone());
    }
}

相关标签: 多线程 java