callable和runable以及线程池对他们的执行

一 Callable接口和Runnable接口相似,都是执行新线程的方法。
区别:
1. Callable需要实现call方法,而Runnable需要实现run方法;
2. Callable与executors联合在一起,在任务完成时可立刻获得一个更新了的Future,runable无返回值

Future接口,一般都是取回Callable执行的状态用的。其中的主要方法:
cancel,取消Callable的执行,当Callable还没有完成时

get,获得Callable的返回值  (根据新建callable时候的泛型,这里直接获取。比如:
public class CallAbleTestThread implements Callable<String>{
 @Override
 public String call() throws Exception {
  System.out.println(Thread.currentThread().getName());
  return Thread.currentThread().getName()+",返回了";
 }
}

 // 构造一个线程池 
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3, 
                TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3), 
                new ThreadPoolExecutor.DiscardOldestPolicy()); 
       
        System.out.println(threadPool.submit(new CallAbleTestThread()).get());
  这里打印:pool-2-thread-1,返回了

isCanceled,判断是否取消了
isDone,判断是否完成

3.线程池调用时,Runnable是用execute方法执行无返回值,Callable用submit执行返回一个Future
  Future<String> fu =  threadPool.submit(new CallAbleTestThread());
        threadPool.execute(new RunAbleTestThread());

二。线程池的关系
 ThreadPoolExecutor extends AbstractExecutorService implements(interface) ExecutorService extends (interface) Executor
 
 有时候使用Executors构造线程池,例如:
 ExecutorService executor = Executors.newFixedThreadPool(10);
 实际上构造的也是一个ThreadPoolExecutor,源码如下:
 


 
总:execute方法是由 Executor接口定义,submit方法是由ExecutorService接口定义。
所以ThreadPoolExecutor  必然可使用 submit获取线程的返回值

 
 
 
 
 
 
 
 

 

### 回答1: callablerunnable都是Java中的接口,但是它们有不同的用途和实现方式。 Callable接口是一个泛型接口,它定义了一个call()方法,该方法可以返回一个结果并抛出一个异常。Callable接口通常用于需要返回结果的任务,例如计算任务、文件读取任务等。 Runnable接口是一个简单的接口,它只定义了一个run()方法,该方法不返回任何结果,也不抛出异常。Runnable接口通常用于执行一些简单的任务,例如打印一些信息、更新UI等。 因此,Callable接口比Runnable接口更灵活,可以返回结果并抛出异常,但是它也更复杂。在实际开发中,我们需要根据具体的需求选择使用哪个接口。 ### 回答2: callable和runable都是Java编程语言中用于实现多线程的接口。虽然它们的功能非常相似,但是它们的区别在于接口中的方法: Runnable接口只有一个无参的run()方法,它描述了线程所执行的代码块。当一个线程被执行时,run()方法会被调用。因此,所有实现了Runnable接口的对象都必须实现run()方法。 Callable接口也类似地描述了一段代码块,但它提供了一个比Runnable更为灵活的方法。Callable接口定义了一个call()方法,这个方法也可以用来实现线程,但与run()方法不同的是,它可以返回一个值。正因为这个原因,Callable接口比Runnable接口更加适用于一些需要返回结果的操作,比如说执行一些计算或者查询等操作。 在实现Callable接口时,必须指定返回值类型。通过这个返回值,我们可以在主线程中获取到线程的执行结果。值得一提的是,当使用Callable接口实现线程时,必须将其包装成Future对象,否则会抛出异常。 总之,Runnable接口和Callable接口都能够实现多线程,但是Callable相对于Runnable更为灵活,可以返回结果,让程序更加高效。而在实际开发中,开发者可以根据需要选择合适的接口来实现线程操作。 ### 回答3: callable和runableJava中常用的两个接口,它们的主要区别在于可用于不同的代码块类型。 Runnable接口是一个很常见的接口,它用于实现线程。它只有一个run()方法,用于定义线程要执行的任务。当线程启动时,run()方法会在单独的线程中被执行。实现Runnable接口的类可以作为一个参数传递给Thread类的构造函数中,并启动一个线程。 Callable接口也是用于实现线程的接口。和Runnable不同的是,它可以返回一个值并抛出异常。Callable接口只有一个方法call(),它可以在调用时返回一个值。Callable接口可以通过Future接口进行封装,以便在异步计算完成后获取结果。 因此,两种接口的主要区别在于是否有返回值和异常处理机制。如果你需要在异步计算块(例如在执行一个线程时)完成后返回一个值,那么你应该实现Callable接口。如果你只需要执行一个任务而不需要返回任何值,那么你应该实现Runnable接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值