用Java实现多线程的方式有两种:①、继承Thread类;②、实现Runnable接口。并且这两种实现方式都是重写run方法。我们知道run方法是没有返回值的。如果你想让一个多线程有一个返回值,那么你可以实现Callable接口。
在实现Callable的时候,你需要去给他一个类型。我们可以看一下Callable的源码:
@FunctionalInterface public interface Callable{ V call() throws Exception; }
传入的类型是为了指定call方法的返回类型。那么接下来,我们让一个类去实现这个接口。代码如下:
import java.util.concurrent.Callable; public class MyCallable implements Callable{ @Override public String call() throws Exception { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+" "+i); } return "程序运行结束"; } }
我们在这个方法里,打印10个数,打印完后,输出 “程序运行结束”。
接下来,我们需要注意,以前使用的是Runnable接口去实现一个多线程,在开启线程时,我们是需要,将他作为一个参数传递给Thread方法。而Callable与此不同的是,他需要将自己的实现类作为参数传递给FutureTask
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class DemoTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCallable mc = new MyCallable();
FutureTask ft = new FutureTask<>(mc);
Thread tr = new Thread(ft);
tr.start();
}
}
运行结果:
在结果中,我们虽然输出了结果,但是却没有获取到放回值,获取返回值的方法存在于FutureTask
MyCallable mc = new MyCallable();
FutureTask ft = new FutureTask<>(mc);
Thread tr = new Thread(ft);
tr.start();
// 获取call方法的返回值
String s = ft.get();
System.out.println(s);
这样子,我们就实现了多线程!



