一.通过Callable接口实现多线程
1.Callable接口介绍:
(1)java.util.concurrent.Callable是一个泛型接口,只有一个call()方法
(2)call()方法抛出异常Exception异常,且返回一个指定的泛型类对象
2.Callable接口实现多线程的应用场景
(1)当父线程想要获取子线程的运行结果时
3.使用Callable接口实现多线程的步骤
(1)第一步:创建Callable子类的实例化对象
(2)第二步:创建FutureTask对象,并将Callable对象传入FutureTask的构造方法中
(注意:FutureTask实现了Runnable接口和Future接口)
(3)第三步:实例化Thread对象,并在构造方法中传入FurureTask对象
(4)第四步:启动线程
例1(利用Callable接口实现线程):
利用Callable接口创建子线程类:
packagecall;
importjava.util.concurrent.Callable;
/*
* 实现Callable接口创建子线程,指明范型为返回的数据类型
* */
publicclassCallDemoimplementsCallable {
@Override
publicString call()throwsException {
Stringth_name= Thread.currentThread().getName();
System.out.println(th_name+"遭遇大规模敌军突袭...");
System.out.println(th_name+"迅速变换阵型...");
System.out.println(th_name+"极速攻杀敌军...");
return"敌军损失惨重,我军大获全胜";
}
}
实线程类:
packagecall;
importjava.util.concurrent.ExecutionException;
importjava.util.concurrent.FutureTask;
publicclassTestCallable {
publicstaticvoidmain(String[]args) {
CallDemocl=newCallDemo();// 实例化Callable子类对象
FutureTaskft=newFutureTask(cl);// 实例化FutureTask对象,并将Callable子类对象传入FutureTask的构造方法中
newThread(ft,"李存孝部队——>").start();// 启动线程
Thread.currentThread().setName("李存勖部队——>");// 设置父线程名
try{
System.out.println(Thread.currentThread().getName() +"休整5000ms");
Thread.sleep(5000);
}catch(InterruptedExceptione) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +"休整完毕..");
try{
Stringstr=ft.get();// 利用FutureTask对象调用get()方法获取子线程的返回值
System.out.println(Thread.currentThread().getName() +"获取友军消息"
+str);
}catch(InterruptedException | ExecutionExceptione) {
e.printStackTrace();
}
}
}
运行结果:
李存勖部队——>休整5000ms
李存孝部队——>遭遇大规模敌军突袭...
李存孝部队——>迅速变换阵型...
李存孝部队——>极速攻杀敌军...
李存勖部队——>休整完毕..
李存勖部队——>获取友军消息敌军损失惨重,我军大获全胜
例2(匿名类部类实现Callable接口创建子线程):
匿名类部类实现Callable接口创建子线程类并实现:
packagecall;
importjava.util.concurrent.Callable;
importjava.util.concurrent.ExecutionException;
importjava.util.concurrent.FutureTask;
//匿名类部类实现Callable接口创建子线程
publicclassAnonyCallable {
publicstaticvoidmain(String[]args) {
Callablecl=newCallable() {
@Override