java是多執行緒的,使用多執行緒有三種方法:繼承Thread類別、實作Runnable介面和使用Callable和Future建立執行緒。
繼承Thread類別 (建議學習:java課程 )
實現方式很簡單,只需要建立一個類別去繼承Thread類別然後重寫run方法,在main方法中呼叫該類別實例物件的start方法即可實作多執行緒並發。程式碼:
public class MyThread extends Thread { @Override public void run(){ super.run(); System.out.println("执行子线程..."); } }
測試案例:
public class Test { public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); System.out.println("主线程..."); } }
#執行結果:
#實作Runnable介面
這種方式的實作也很簡單,就是把繼承Thread類別改為實作Runnable介面。程式碼如下:
public class MyRunnable implements Runnable { @Override public void run() { System.out.println("执行子线程..."); } }
測試案例:
public class Test { public static void main(String[] args) { Runnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); System.out.println("主线程运行结束!"); } }
#執行結果:
使用Callable和Future建立執行緒
#########上面的兩種方式都有這兩個問題:#########無法取得子執行緒的回傳值# #####run方法不可以拋出例外######為了解決這兩個問題,我們就需要用到Callable這個介面了。說到接口,上面的Runnable接口實作類別實例是作為Thread類別的建構子的參數傳入的,之後透過Thread的start執行run方法中的內容。但是Callable並不是Runnable的子接口,是個全新的接口,它的實例不能直接傳入給Thread構造,所以需要另一個接口來轉換一下。 #########在這裡面其實就是要比上一個方法再多一個轉換過程,最終一樣是透過Thread的start來建立新執行緒。有了這個思路,程式碼就很容易理解了:######import java.util.concurrent.Callable; public class MyCallable implements Callable { int i = 0; @Override public Object call() throws Exception { System.out.println(Thread.currentThread().getName()+" i的值:"+ i); return i++; //call方法可以有返回值 } }######測試:######
import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class Test { public static void main(String[] args) { Callable callable = new MyCallable(); for (int i = 0; i < 10; i++) { FutureTask task = new FutureTask(callable); new Thread(task,"子线程"+ i).start(); try { //获取子线程的返回值 System.out.println("子线程返回值:"+task.get() + "\n"); } catch (Exception e) { e.printStackTrace(); } } } }######執行結果(部分):#### ###########
以上是java是多執行緒的嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!