java中的线程任务Runnable接口Callable接口

在java中只有implements  Runnable接口或Callable接口的类 才能被线程调用。java类实现了Runnable接口或实现了Callable接口。两者都可以被ExecutorService接口的实现类调用execute()或submit()方法实现,但是Runnable接口任务没有返回值,并且无法抛出经过检查的异常。而Callable任务有返回值,返回结果并且可能抛出异常的任务,实现者定义了一个不带任何参数的叫做 call 的方法。并且Callable的call()方法只能通过ExecutorService的( task) 方法来执行。具体可以查看JDK帮助文档

public interface Callable

返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。

Callable 接口类似于Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。Callable中的call()方法类似Runnable的run()方法,就是前者有返回值,后者没有。当将一个Callable的对象传递给ExecutorService的submit方法,则该call方法自动在一个线程上执行,并且会返回执行结果Future对象。同样,将Runnable的对象传递给ExecutorService的submit方法,则该run方法自动在一个线程上执行,并且会返回执行结果Future对象,但是在该Future对象上调用get方法,将返回null。

package com.dcits.thread;

 

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

 

public class CallableTest {

 

   /**

    * 测试Callable接口的call返回值

    */

   public static void main(String[] args) {

      ExecutorService newExecutorService = Executors.newCachedThreadPool();

     

      //Callable接口的实现类的call 方法返回什么类型这里的Future 就是什么类型

      Future future= newExecutorService.submit(new ThreadTest6(110));

      try {

         if(future.get() != null){

            System.out.println("======"+future.get());

         }

      } catch (InterruptedException e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      } catch (ExecutionException e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      }

   }

}

 

注意:如果需要在异步线程返回结果或者出现异常后执行其他操作,建议使用Callable 接口类,并使用ExecutorService 的submit(Callable )方法,返回一个Future 类型对象,Future对象上调用get方法获取信息

你可能感兴趣的:(Thread,Runnable,Callable)