Java多线程开发
Java多线程使用的三种方法:
1.通过继承Thread类,重写run方法;
2.实现Runnable接口,摆脱第一种方法的继承,解耦;
3.实现Callable接口,FutureTask获取返回值;
方法一:
创建一个类去继承Thread类然后重写run方法
/* * 继承Thread类 * 创建一个类去继承Thread类然后重写run方法,在main方法中调用该类实例对象的start方法即可实现多线程并发*/ public class MyThread extends Thread{ public void run(){ System.out.println("生产MyThread..."); } }
main调用:
public class TestMain { public static void main(String[] args) throws ExecutionException, InterruptedException { // 方法一 Thread myThread=new MyThread(); myThread.start(); System.out.println("执行主程序1"); } }
方法二:
创建一个类实现Runnable接口,摆脱第一种方法的继承,实现解耦
/*实现Runnable接口*/ public class MyRunnable implements Runnable{ @Override public void run() { System.out.println("生产MyRunnable..."); } }
main调用:
// 方法二 MyRunnable myRunnable = new MyRunnable();//Runnable接口实现类实例作为Thread类的构造函数的参数传入 Thread thread = new Thread(myRunnable); thread.start();//Thread类的作用就是把run()方法包装成线程执行体,然后依然通过start去告诉系统这个线程已经准备好了可以安排执行 System.out.println("执行主程序2");
方法三:
实现Callable接口,FutureTask获取返回值
import java.util.concurrent.Callable; public class MyCallable implements Callable { @Override public Object call() throws Exception { System.out.println("生产MyCallable..."); String ret="MyCallable"; return ret; } }
main调用:
// 方法三 Callable callable = new MyCallable(); //FutureTask类提供了Future的基本实现,提供了启动和取消计算、查询计算是否完成以及检索计算结果的方法。 FutureTask futureTask = new FutureTask(callable); new Thread(futureTask).start(); try { //结果只能在计算完成时检索;如果计算尚未完成,get方法将阻塞 //所以用到返回值的线程,只有在new Thread(futureTask).start()完成后,才会执行 System.out.println("执行主程序3,调用返回值:"+futureTask.get()); //System.out.println("执行主程序3,调用返回值:"); //System.out.println(futureTask.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }
一个线程的生命周期:
优缺点对比:
第一种方法最简洁方便但是第一种方法有一个很不好的地方就是继承了Thread类,受制于java的单继承机制,就不可以继承其他的类了
第二种方法在第一种方法基础上,摆脱了继承,转换为接口,实现解耦
第三种方法相较于前两种方法:可以获取返回值,可以抛出异常等