获取多线程的方式
1. 继承Thread
2. 实现Runnable接口
3. 实现Callable接口 带范型有返回值 FutureTask(Callable<V>)
4. 线程池
Callable返回值获取放在最后(futureTask.get())
调用多次FutureTask仍然只执行一次,执行多次则需要创建多个FutureTask
/**
* Callable创建线程的方式(Callable带返回值)
*/
class MyThreadByCallable implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName() + " 来模拟计算");
// 模拟计算业务
TimeUnit.SECONDS.sleep(3);
return 1024;
}
}
/***
* 三种创建线程方式
* 1、继承Thread类
* 2、实现Runnable接口
* 3、使用Callable<String>接口,结合FutureTask
* 今天就来演示Callable创建线程的方式(Callable带返回值)
*/
public class CallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<Integer> futureTask = new FutureTask<>(new MyThreadByCallable());
// FutureTask<Integer> futureTask2 = new FutureTask<>(new MyThreadByCallable());
Thread thread = new Thread(futureTask, "t1");
thread.start();
// 调用多次FutureTask仍然只执行一次,执行多次则需要创建多个FutureTask
// Thread thread2 = new Thread(futureTask2, "t2");
// thread2.start();
// Callable返回值获取如果放在这里,它会阻塞main线程计算,会影响并发效率
// Integer t1Result = futureTask.get();
// main线程模拟计算
Integer mainResult = 1000;
System.out.println("main线程计算完毕,mainResult=" + mainResult);
/*while(!futureTask.isDone()){
}*/
// Callable返回值获取最好放在最后,否则如果t1计算时间过长,它会阻塞main线程计算
Integer t1Result = futureTask.get();
System.out.println("t1线程计算完毕,t1Result=" + t1Result);
System.out.println("两个线程计算总和为:" + (mainResult + t1Result));
System.out.println(Runtime.getRuntime().availableProcessors());
}
}