Java 实现多线程的几种方式汇总
我们先来看段示例代码
importjava.util.concurrent.Callable;
importjava.util.concurrent.FutureTask;
publicclassMain{
publicstaticvoidmain(String[]args){
//方法一:继承Thread
inti=0;
//for(;i<100;i++){
//System.out.println(Thread.currentThread().getName()+""+i);
//if(i==5){
//ThreadExtendsThreadthreadExtendsThread=newThreadExtendsThread();
//threadExtendsThread.start();
//}
//}
//方法二:实现Runnable
//for(i=0;i<100;i++){
//System.out.println(Thread.currentThread().getName()+""+i);
//if(i==5){
//Runnablerunnable=newThreadImplementsRunnable();
//newThread(runnable).start();
//newThread(runnable).start();
//}
//}
//方法三:实现Callable接口
Callable<Integer>callable=newThreadImplementsCallable();
FutureTask<Integer>futureTask=newFutureTask<>(callable);
for(i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+""+i);
if(i==5){
newThread(futureTask).start();
newThread(futureTask).start();
}
}
try{
System.out.println("futureTaskruturn:"+futureTask.get());
}catch(Exceptione){
e.printStackTrace();
}
}
}
接下来我们来详细探讨下Java实现多线程的几种方式
方法一,继承自Thread
publicclassThreadExtendsThreadextendsThread{
privateinti;
@Override
publicvoidrun(){
for(;i<100;i++){
System.out.println(getName()+""+i);
}
}
}
run方法为线程执行体,ThreadExtendsThread对象即为线程对象。
方法二,实现Runnable接口
publicclassThreadImplementsRunnableimplementsRunnable{
privateinti;
@Override
publicvoidrun(){
for(;i<100;i++){
System.out.println(Thread.currentThread().getName()+""+i);
}
}
}
run方法为线程执行体,使用时New一个Thread对象,Runnable对象作为target传递给Thread对象。且同一个Runnable对象可作为多个Thread的target,这些线程均共享Runnable对象的实例变量。
方法三,实现Callable接口
importjava.util.concurrent.Callable;
publicclassThreadImplementsCallableimplementsCallable<Integer>{
privateinti;
@Override
publicIntegercall()throwsException{
for(;i<100;i++){
System.out.println(Thread.currentThread().getName()+""+i);
}
returni;
}
}
Callable接口类似于Runnable接口,但比对方强大,线程执行体为call方法,该方法具有返回值和可抛出异常。使用时将Callable对象包装为FutureTask对象,通过泛型指定返回值类型。可稍候调用FutureTask的get方法取回执行结果。