实现多线程有***三种方式***:第一种:继承Thread类。第二种:实现Runnale接口。第三种:实现Callable接口。
下面我着重分享第三种如何实现多线程。
package Demo2;
import java.util.concurrent.Callable;
public class MyCallable implements Callable<String> {
@Override
public String call() {
System.out.println("北国商城");
return "我购买了北国商城";
}
}
package Demo2;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Test {
public static void main(String[] args) {
MyCallable myCallable = new MyCallable();
FutureTask<String> futureTask = new FutureTask(myCallable);
Thread thread = new Thread(futureTask);
thread.start();
try {
String hello = futureTask.get();
System.out.println(hello);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
public interface Callable<V> {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}
这里源代码有泛型,即返回值类型<>,public class MyCallable implements Callable<String>
Callable显然是有返回值的,对应的重写call方法也是有返回值的。应该注意以下几点!
.
- Runnable没有返回值,Callable有返回值。
- FutureTask**<String**> futureTask = new FutureTask(myCallable); 这里面的返回值应该和Callable相同。
- return返回值接受应该用: String hello = futureTask.get();来接受。同时记得处理异常Ctrl+Alt+T快捷键。
Runnable和Callable的不同