实例代码://这里的<Object>是指的返回值的类型。因为Object是所有类的父类,为了简便写了Object。 public class MyCallableThread implements Callable<Object> { //call()方法跟run()一样,当线程开启的时候会自动执行,但是它更牛逼,有返回值。 public Object call() throws Exception { //获取当前正在运行的线程名 String threadName=Thread.currentThread().getName(); System.out.println(threadName + " is running!"); //计算1+1 int result=1+1; //返回计算结果 return " 1 + 1 = "+result; } }
测试代码public class MyTest { public static void main(String[] args) throws Exception { MyCallableThread myCallableThread=new MyCallableThread(); FutureTask futureTask=new FutureTask(myCallableThread); Thread thread=new Thread(futureTask); thread.start(); Object answer = futureTask.get(); System.out.println("Thread-0 的计算结果:"+answer); } }
输出:
Thread-0 is running!
Thread-0 的计算结果: 1 + 1 = 2
一般线程操作都需要用到Thread类。
Runnable接口的实现类可以当作参数传给Thread的构造函数。
Callable不能直接与Runnable直接由关系,需要借助第三者FutureTask才能和Thread有关系。
为什么我们重写的是run()方法,或者是call()方法,但是启动线程的时候调用的是start()方法呢?
这个问题其实很简单,run()和call()方法是写我们需要运行的代码的地方。
而start()他调用的是Thread类中的一个 本地方法 ,注意是 本地方法,而我们知道线程本质上是操作系统来实现的,所以这个start()就是告诉操作系统,我们要开始-start()一个线程,然后让开始的这个线程去运行-run()或者调用-call()方法。
Callable的设计好巧妙。