runnable 和 callable 有什么区别

(2) 2024-05-02 14:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说runnable 和 callable 有什么区别,希望能够帮助你!!!。

runnable和callable的区别

  • Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;
  • Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。

runnable和callable使用

runnable使用

  • 定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
  • 创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
  • 调用线程对象的start()方法来启动该线程。

callable使用

callable的源码如下

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

存在一个泛型保存返回结果,所以可以使用Future保存异步计算结果
Future接口具有以下方法

public interface Future<V> {
	V get() throws . .;
	V get(long timeout, TimeUnit unit) throws . .
	void cancel(boolean maylnterrupt);
	boolean isCancelled();
	boolean isDon(); 
}
  • 第一个 get 方法的调用被阻塞, 直到计算完成。
  • 如果在计算完成之前, 第二个方法的调用超时,拋出一个 TimeoutException 异常。如果运行该计算的线程被中断,两个方法都将拋出 IntermptedException。
  • 如果计算已经完成, 那么 get 方法立即返回。
  • 如果计算还在进行,isDone 方法返回 false; 如果完成了, 则返回 true。
  • cancel 方法取消该计算。如果计算还没有开始,它被取消且不再开始。如果计算
    处于运行之中,那么如果 maylnterrupt 参数为 true, 它就被中断。

为了把callable接口转换为Runable和Future,java提供了FutureTask 包装器

  • FutureTask 包装器是一种非常便利的机制, 可将 Callable转换成 Future 和 Runnable, 它
    同时实现二者的接口。代码示例如下:
public class CallableTest<V> implements Callable {
    @Override
    public Integer call() throws Exception {
        int a = 0;
        for (int i = 0; i < 100; i++) {
            a=a+i;
            Thread.sleep(10);
        }
        return a;
    }
}

创建如上一个callable接口实现类

        CallableTest<Integer> integerCallableTest = new CallableTest<>();
        FutureTask<Integer> integerFutureTask = new FutureTask<Integer>(integerCallableTest);//实例化FutureTask,使用callableTest
        Thread thread = new Thread(integerFutureTask);//FutureTask实例作为Thread的target来创建Thread对象。
        thread.start();
        Integer integer = integerFutureTask.get();

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复