参考:
三种方法
Runnable和Callable异同
相同:
不同:
注意:
Callable接口支持返回结果,需要通过FutureTast对象的get方法获得,需要阻塞主线程直到获取结果,不调用get则不会阻塞。
Callable的优势
多线程返回执行结果是一个很有用的特性,因为多线程相比单线程更难、更复杂的一个重要原因就是因为多线程充满着未知性,某条线程是否执行了?某条线程执行了多久?某条线程执行的时候我们期望的数据是否已经赋值完毕?无法得知,我们能做的只是等待这条多线程的任务执行完毕而已。而Callable+Future/FutureTask却可以获取多线程运行的结果,可以在等待时间太长没获取到需要的数据的情况下取消该线程的任务,真的是非常有用。
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* @description:
* @modifyContent:
* @author: Maple Chan
* @date: 2020-04-05 20:24:46
* @version: 0.0.1
*/
public class JavaTheadTest {
public static final int COUNT = 100;
public static void main(String[] args) {
// 1.
new Thread(new MyThread(), "线程1,实现Runnable接口").start();
// 2.
new Thread(new Runnable() {
@Override
public void run() {
int count = COUNT;
while (count > 0) {
System.out.println("1. In Runnable");
count--;
}
}
}, "线程1,实现Runnable接口,在调用处定义线程内容").start();
// 3.
new MyThread2().start();
// 4.
MyCallable myCallable = new MyCallable();
FutureTask<String> futureTask = new FutureTask<>(myCallable);
String res = null;
try {
new Thread(futureTask, "线程Callable").start();
res = futureTask.get();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(res);
}
}
class MyThread implements Runnable {
/**
*@description
*@author Maple Chan
*@date: 2020-04-05 20:22:59
*@params void
*@return void
*/
@Override
public void run() {
int count = JavaTheadTest.COUNT;
while (count > 0) {
System.out.println("2. In MyThread");
count--;
}
}
}
class MyThread2 extends Thread {
@Override
public void run() {
super.run();
int count = JavaTheadTest.COUNT;
while (count > 0) {
System.out.println("3. In MyThread2");
count--;
}
}
}
class MyCallable implements Callable<String> {
/**
* 该call方法作为线程执行体,并且有返回值
*/
@Override
public String call() throws Exception {
int count = JavaTheadTest.COUNT;
while (count > 0) {
System.out.println("4. In MyCallable");
count--;
}
return "success";
}
}