Java建立線程的方法有以下3種。java
1)繼承Thread類建立線程 extends Thread
2)實現Runnable接口建立線程 implements Runnable
3)實現Callable接口和Future建立線程 implements Callable
他們之間的關係以下:web
public class MyThread extends Thread { public MyThread() { super("MyThread"); } @Override public void run() { long sum=0; for(int i=0;i<1999999999l;i++){ sum+=i; } System.out.println(sum); } }
啓動線程,即調用線程的start()或者run()方法多線程
public class Text{ public static void main(String[] args) { //第一種方式啓動線程 MyThread my=new MyThread(); my.start(); //第二種方式啓動線程 new Thread(my).start(); } }
public class MyThread2 implements Runnable { private int ticket = 10; public MyThread2() { Thread.currentThread().setName("售票線程"); } /** * 模仿售票服務 */ @Override public void run() { while (true) { if (ticket > 0) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "is saling...." + ticket--); } } } }
啓動線程:執行start()或者run()方法ide
public class Text02 { public static void main(String[] args) { /*MyThread2 tt=new MyThread2(); //啓動三個線程 new Thread(tt).start(); new Thread(tt).start(); new Thread(tt).start();*/ new MyThread2().run(); new MyThread2().run(); new MyThread2().run(); } }
public class MyThread3 implements Callable<String> { //能夠做爲入參的接口 public MyThread3(){ Thread.currentThread().setName("MyThread3"); } /** * 特色:1.具備返回值 2.能夠拋出異常 * @return * @throws Exception */ @Override public String call() throws Exception { return "true"; } }
啓動:java使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了Callable對象的call()方法的返回值。調用FutureTask對象的get()方法來得到子線程執行結束後的返回值。svg
public class Text03 { public static void main(String[] args) { MyThread3 myThread3=new MyThread3(); //執行 Callable 方式,須要 FutureTask 實現類的支持,用於接收運算結果 FutureTask<String> future = new FutureTask<>(myThread3); //啓動線程 new Thread(future).start(); try { String result = future.get(); System.out.println("結果是--"+result); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
一、線程只是實現Runnable或實現Callable接口,還能夠繼承其餘類。若是繼承Thread類的線程類不能再繼承其餘父類(Java單繼承決定)。注:通常推薦採用實現接口的方式來建立多線程。線程
二、實現Runnable和實現Callable接口的方式基本相同,不過是後者執行call()方法有返回值,後者線程執行體run()方法無返回值。code