005 创建线程的问题

一 . 概述

  我们在创建线程的过程中是通过重写run()方法来实现的.

我们可以看到run()方法的声明:  

    public void run() ;

在上面的方法声明之中有两个缺陷:

[1]该方法没有返回值

[2]该方法没有异常声明

  上面说的问题也可以说是传统创建线程的缺陷. 


二 .问题的解决

  在jdk1.5之前,我们需要解决上面的缺陷需要自己使用一些技巧来完成.

  在jdk1,5之后,出现了一个新的方式来创建线程.

  通过这种方式,我们可以解决上述的问题.


三 .例子

  首先查看一个接口: 

@FunctionalInterface
public interface Callable<V> {
    V call() throws Exception;
}

我们可以看到这个这个接口是有返回值的,而且是有异常声明的.

然后我们再看下面的一个类:

public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V>

我们发现FutrueTask是Runnable的子类.

那也就是说我们可以通过这样的方式来创建一个带返回值的线程执行单元,并且可以声明异常.

public class CallTest {
    
    public static void main(String[] args) {
        //创建Callable接口的对象
        Callable<Integer> call = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                for(int i = 0; i<100 ;i++) {
                    System.out.println(i +" thread running ...");
                }
                return 100;
            }
        };
        //创建FutureTask对象
        FutureTask<Integer> task = new FutureTask<>(call);
        new Thread(task).start();
    }
}

我们可以认为Callable接口是一个Runnable接口的变种,等价于run()方法.


 四 .获取返回值

  我们可以通过FutureTask对象来获取返回值.

  加工上述的代码:

    

public static void main(String[] args) {
        //创建Callable接口的对象
        Callable<Integer> call = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                for(int i = 0; i<100 ;i++) {
                    System.out.println(i +" thread running ...");
                }
                return 100;
            }
        };
        //创建FutureTask对象
        FutureTask<Integer> task = new FutureTask<>(call);
        new Thread(task).start();
        System.out.println("主线程在运行.....");
        try {
            System.out.println("result == " + task.get());
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

我们通过红色的部分来完成返回值的获取了.

其实现在有了一个疑问了,那就是主线程怎么知道结果何时会返回呢?

  这个疑问在后面会解释清楚的.

猜你喜欢

转载自www.cnblogs.com/trekxu/p/8975297.html
005