建立JAVA執行緒的三種主要方式
阿新 • • 發佈:2018-11-21
程式 程序 執行緒
程式: 一組計算機指令有序的集合
程序: 具有一定功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。
執行緒: 執行緒是程序的實體,是cpu分派和排程的基本單位,它是比程序更小的能獨立執行的基本單位。執行緒自己基本上不擁有系統資源,值擁有一點在執行時必不可少的資源(程式計數器 一組暫存器和棧);但他可以和同屬程序的其他執行緒共享程序的所有資源。
1. 擴充套件(即繼承)java.lang.Thread類
/** * @author FengTianHao * @version 1.0 * @since 2018/11/15 17:04 */ /** * 此種實現java執行緒的方式中,run()方法中的程式碼是執行緒要執行的程式碼段,無返回值 * * 啟動執行緒是在Thread物件上呼叫start()方法 */ public class TestThread extends Thread{ @Override//重寫父類的run()方法 public void run()//該方法裡面的程式碼段是執行緒要執行的程式碼段 { System.out.println("TestThread.run"); } public static void main(String[] args) { TestThread thread=new TestThread();//建立執行緒 thread.start();//啟動執行緒 } }
2.實現java.lang.Runable介面
/** * @author FengTianHao * @version 1.0 * @since 2018/11/15 17:04 */ /** * 如果採用實現Runnable來實現執行緒需要呼叫Thread構造方法 * Thread(Runnable target) * Thread(Runnable target, String name) * Thread(ThreadGroup group, Runnable target) * Thread(ThreadGroup group, Runnable target, String name) * Thread(ThreadGroup group, Runnable target, String name, long stackSize) */ public class TestThread implements Runnable{ private String name;//可以給執行緒起名字 public TestThread(String name) { this.name=name; } @Override public void run() { for(int i=0;i<100;i++) { System.out.println(name+i); } } public static void main(String[] args)throws Exception { TestThread thread=new TestThread("fth"); Thread t1=new Thread(thread); t1.start(); } }
3.使用callable和future建立執行緒
/** * @author FengTianHao * @version 1.0 * @since 2018/11/15 17:04 */ import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** 從javajdk5開始,java提供Callable介面,該介面提供一個方法call() * 該方法作為執行緒執行體 * 該方法可以有返回值,還可以丟擲異常 * java jdk5提供了Future介面來代表call方法的返回值 * 並提供了Future介面的實現類FutureTask * FutureTask類實現了Future的介面,也實現了Runnable的介面 */ public class TestThread implements Callable<Integer> { //建立Callable介面的實現類,並實現call方法 int i=0; @Override public Integer call() throws Exception { for(;i<10;i++){} return i; } public static void main(String[] args) { TestThread thread=new TestThread(); FutureTask<Integer> ft=new FutureTask<>(thread);//使用FutureTask類封裝Callable物件的call方法的返回值 Thread td=new Thread(ft);//使用FutureTask物件作為Thread的target建立執行緒 td.start();//啟動執行緒 try { System.out.println(ft.get());//通過FutureTask中的get方法獲得執行緒執行完後的返回值 } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
結論
採用Runnable和Callable的優勢:執行緒類在實現Runnable介面或者Callable介面的情況下還可以繼承其他類,這可以使多個執行緒共享一個target物件,因此適合多個執行緒處理同一份資源。一般推薦通過實現介面來建立多執行緒。