如果希望任务在完成时能够返回一个值,那么可以实现Callable 接口而不是 Runnable 接口。 在 Java SE5 中引入的 Callable 是一个具有类型参数的泛型,它的类型参数表示的是从方法 call() 中返回的值 必须使用ExecutorService.submit() 方法调用实现 Callable接口的类的对象 submit方法会产生Future对象,它用Callable返回结果的类型进行了参数化。 示例 import java.util.ArrayList; import java.util.concurrent.*; /** * Callable+Future使用示例 * User: pengyapan ){ results.add(executorService.submit(new TaskWithResult(i))); // submit方法会产生Future对象,它用Callable
为了之处这个特性,在java中就增加了Callable接口。 Callable vs Runnable 为了实现Runnable接口,需要实现不返回任何返回值的run方法,而对于callable,我们需要实现在完成的时候,返回接口的call方法,注意,线程不能用Callable 需要注意的是,Callable和Future做了两件不同的事情,Callable和Runnable类似,因为它封装了一个任务,该任务在另外一个线程上运行,而Future用于存储从另外一个线程获得的结果, FutureTask可以通过为其提供的构造函数来创建Callable,然后将FutureTask对象提供给Thread的构造函数来创建Thread对象。因此,间接的实现了Callable创建线程。 在此要重点强调的是,没有办法直接用Callable创建线程。
热卖云产品新年特惠,2核2G轻量应用服务器9元/月起,更多上云必备产品助力您轻松上云
也就是说callable执行任务,而Future拿到执行的结果。Future具有阻塞性在于其get()方法具有阻塞性,而isDone()是不具有阻塞性的。 如果需要返回结果,同时需要进一步加工的时候,就可以考虑使用Future+Callable了。 MyCallable callable3 = new MyCallable("236", 3000); MyCallable callable4 = new MyCallable ("678", 2000); MyCallable callable5 = new MyCallable("789", 1000); List<Callable (callable2); callableList.add(callable3); callableList.add(callable4);
run() { System.out.println("My Thread"); } }; } } Callable Calllable同样也是一个接口,也是用来创建线程的,只不过略微有点区别,Callable中的是call方法,同样可以由一个类实现Callable接口,重写call方法,然后作为Thread的参数, 用法如下: class MyThread implements Callable<String> { private int ticket = 10 ; // 一共10张票 @ 接口的任务线程能返回执行结果;而实现Runnable接口的任务线程不能返回结果; Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛 不调用get方法就不会阻塞,也就说Callable如果不调用get方法,效果就和Runnable差不多。
API callable(object) 检查对象object是否可调用。 如果返回True,object仍可能调用失败; 如果返回False,object一定调用失败。 实验代码 assert callable(0) == False assert callable("Hello Python") == False def add(a, b): return a + b assert callable(add) == True class A: def method(self): return 0 assert callable(A ) == True a = A() assert callable(a) == False class B: def __call__(self): return 0 assert callable(B) == True b = B() assert callable(b) == True # 这边为什么是 True 我也没搞懂,等后面再回过头来研究一下 ---- ----
callable(object) 该函数的作用是检查对象object是否可调用。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。 >>> callable(0) False >>> callable("mystring") False >>> def add(a, b): … return a + b … >>> callable (add) True >>> class A: … def method(self): … return 0 … >>> callable(A) True >>> a = A( ) >>> callable(a) False >>> class B: … def __call__(self): … return 0 … >>> callable(B) True >>> b = B() >>> callable(b) True 实际上我们可以自己实现callable方法: def callable(object): return hasattr(object
引入 Callable + Future Callable + Future实例 引入 Callable + Future Executor框架的优势之一就是,可以运行并发任务并且返回结果。 这个接口就是 Callable接口:这个接口声明了一个call方法,类似于Runnable接口的run方法,是任务具体的逻辑,不同就在于可以有返回值,而且这个接口是一个泛型接口,这就意味着必须声明call image.png Callable + Future实例 接下来,我们编写一个实例来接受任务的返回结果 实现一个Callable对象,由于返回值是Integer,所以定义为Callable<Integer ; public class FactorialCaculator implements Callable<Integer> { private Integer number; 通过call方法获取返回结果,为了达到这个目的,可以使用get方法,这个方法会一直等到callable对象的call方法返回结果。如果此时任务尚未完成,get方法就会一直阻塞到线程完成。
不过,Java中,也提供了使用Callable和Future来实现获取任务结果的操作。Callable用来执行任务,产生结果,而Future用来获得结果。 Callable Callable接口与Runnable接口是否相似。 Callable位于java.util.concurrent包下,它也是一个接口,在它里面也只声明了一个方法,只不过这个方法叫做call()。 public interface Callable<V> { /** * Computes a result, or throws an exception if unable to { public static void main(String[] args) throws Exception{ Callable<Integer> callable =
Callable接口: Callable,新启线程的一种方式,返回结果并且可能抛出异常的任务,在前面的新启线程的文章中用过,但是没有具体讲解 优点: 可以获取线程的执行结果,也称为返回值 通过与Future的结合,可以实现利用Future来跟踪异步计算的结果 Runnable和Callable的区别: Callable规定的方法是call(),Runnable规定的接口是run (); Callable的任务执行后可返回值,而Runnable的任务是不能有返回值的; call方法可以抛出异常,run方法不可以 运行Callable任务可以拿到一个Future对象,表示异步计算的结果 或者Runnable接口的实现对象,因为FutureTask实现了Runnable接口,所以FutureTask也可以提交给线程池 Callable,Future,FutureTask三者之间的关系: image.png Callable的两种执行方式: 1:借助FutureTask,包装Callable接口的实现类,然后传递给Thread线程执行 package org.dance.day2.future
是一个可调用对象类型 查看是否可调用 语法 isinstance(对象, Callable) # 返回True或False 栗子 # 最简单的函数 def print_name(name: str ): print(name) # 判断函数是否可调用 print(isinstance(print_name, Callable)) x = 1 print(isinstance(x, Callable )) # 输出结果 True False 函数是可调用的,所以是 True,而变量不是可调用对象,所以是 False Callable 作为函数参数 看看 Callable 的源码 Callable type; Callable[[int], str] is a function of (int) -> str. 作为函数返回值 # Callable 作为函数返回值使用,其实只是做一个类型检查的作用,看看返回值是否为可调用对象 def get_name_return() -> Callable[[str],
runnable 线程接口 需要实现run接口 没有返回值(void run) 没有抛出异常 callable 有返回值 有抛出异常 thread 类,实现了runnable接口 future 接口,实现类 futuretask,获取异步计算结果 线程运行结果,是否在运行,是否运行完成等 callable结果通过future。
6.实现 Callable 接口 前言 本篇章来介绍一下创建线程的第三种方式,其中创建线程一共有四种方式: 继承 Thread 类 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式 那么下面我们来介绍一下 实现 Callable 接口的方式。 Callable 接口 - Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口 - Callable 接口类似于 Runnable 它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值 代码示例 1.创建一个实现Callable的实现类, 可以通过设置泛型,指定call方法返回的类型 import java.util.concurrent.Callable; //1.创建一个实现Callable的实现类, 可以通过设置泛型,指定call方法返回的类型 class CallableThread
A Callable is "A task that returns a result, while a Supplier is "a supplier of results". In other words a Callable is a way to reference a yet-unrun unit of work, while a Supplier is a way to It's possible that a Callable could do very little work and simply return a value. Another way of phrasing the distinction is that a Callable may have side-effects (e.g. writing to a file If the work is idempotent use a Supplier, if not use a Callable.
Callable和Runnable都是一个接口。 Callable Callable和Runnable最大的区别就是它的call方法有一个返回值。 Future就是对于具体Callable任务的执行结果进行取消、查询是否完成、获取结果、设置结果操作,其中get()方法会阻塞,所以通过get()方法可以判断线程是否执行完毕。 submit 和 execute的区别 execute执行的是一个Runnable任务,submit 执行 Runnable和Callable都可以。 Callable一般都是提交给ExecuteService来执行,核心方法是call(),通过submit方法执行。 Runnable执行没有返回;Callable有返回。
python内置函数 callable用于检查一个对象是否是可调用的,如果函数返回True,object 仍然可能调用失败;但如果返回 False,调用对象 object 绝对不会成功。 一.callable函数简介 语法如下: callable(object) 参数介绍: object : 调用的对象; 返回值:返回bool值,如果object对象可以被调用返回true,不能被调用返回 二.callable函数使用 # ! """ def test(func): # 判断func如果是函数,就执行他,如果不是函数,直接返回 # 判断func是否可调用,如果可以调用,就是true if callable
runnable 和 callable 有什么区别? 两者都是接口;(废话) 2、两者都可用来编写多线程程序; 3、两者都需要调用Thread.start()启动线程; 不同点: 1、两者最大的不同点是:Runnable 接口 run 方法无返回值;Callable 2、Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出异常,可以获取异常信息。
但是处理结果将在”未来”某一时刻,才真正需要,在此之前,其它线程可以继续处理自己的事情 package com.cnblogs.yjmyzz; import java.util.concurrent.Callable ExecutionException { FutureTask<String> task = new FutureTask<String>( new Callable FutureTask处理结果:" + task.get()); System.out.println("全部处理完成"); } } 二个注意点: a) FutureTask使用Callable
今天我们来讲一讲Callable和Future。 这也就引出了Callable的作用: Callable: 也是一个接口,用来描述线程任务,但是他是一个有返回值的线程任务。 创建一个有返回值的线程任务Callable, 返回String Callable<String> c = new Callable(){ @Override 二、线程池执行Callable 除了上面的方式以外,我们仍然可以使用线程池来运行有返回值的线程任务-Callable。 : Callable<String> c1 = Executors.callable(r1, "result"); // 然后运行Callable的方式即可:
而这正是 is_callable() 存在的目的。 如何来做 is_callable 接收一个回调参数,可以指定一个函数名称或者一个包含方法名和对象的数组,如果在当前作用域中可以执行,就返回TRUE,如果不能就FALSE。 补充 is_callable 还有其他的用法,例如不检查所提供的类或方法,只是检查函数或方法的语法是否正确。像 method_exists一样,is_callable 可以触发类的自动加载。 如果一个对象有魔术方法 __call,在进行方法判断的时候 method_exists 会返回FALSE , 而is_callable 会返回TRUE。 (array($obj,'runtest'))); echo ''; 参考资料: 1、is_callable 2、method_exists
接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。 Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被 ,下面来看一个简单的例子: public class CallableAndFuture { public static void main(String[] args) { Callable <Integer> callable = new Callable<Integer>() { public Integer call() throws Exception { 下面来看另一种方式使用Callable和Future,通过ExecutorService的submit方法执行Callable,并返回Future,代码如下: public class CallableAndFuture
扫码关注腾讯云开发者
领取腾讯云代金券