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方法取回执行结果。