這篇文章帶給大家的內容是關於Java多執行緒的實作方法總結(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
1.何時使用多執行緒程式設計
一個任務在正常情況下是依序執行的,但是如果目前任務裡有多個相似進程區塊(例如for,while語句) ,我們就可以考慮把這些程式碼區塊抽出來並行運行,無需阻塞
2.實作多執行緒的幾種方式
一種是繼承Thread類別重寫run方法,另一種是實作Runnable介面重寫run方法
啟動多執行緒很多情況下是為了處理並發進程,此時對於部分即時性要求不是那麼高的業務需求,我們還可以透過實作佇列的方式,異步實現。
3.範例
繼承Thread
/** * * @ClassName: ThreadByEx * @Description: TODO * @author Mr.jqCheng * @date 2018年9月26日 * */public class ThreadByEx extends Thread{ @Override public void run() { // TODO Auto-generated method stub System.out.println("我是继承线程"); } }
實作Runnable
/** * * @ClassName: ThreadByRunnable * @Description: TODO * @author Mr.jqCheng * @date 2018年9月26日 * */public class ThreadByRunnable implements Runnable{ /*public ThreadByRunnable() { this.run(); // TODO Auto-generated constructor stub }*/ public void run() { // TODO Auto-generated method stub System.out.println("我是实现进程"); } }
測試:
/** * * @ClassName: Test * @Description: TODO * @author Mr.jqCheng * @date 2018年9月26日 * */public class Test { public static void main(String[] args) { // 继承Thread启动的方法 ThreadByEx t1 = new ThreadByEx(); t1.start();// 启动线程 // 实现Runnable启动线程的方法 ThreadByRunnable r = new ThreadByRunnable(); Thread t2 = new Thread(r); t2.start();// 启动线程 //new ThreadByRunnable(); } }
執行結果:
我是繼承線程
我是實作進程
ok,簡單的多執行緒實作方式完成了,在呼叫start()的時候,該行程已經進入可執行狀態,等待系統執行。
執行緒處理的幾個常用方法:
void interrupt():向執行緒發送中斷請求,執行緒的中斷狀態將會被設定為true,如果目前執行緒被一個sleep呼叫阻塞,那麼將會拋出interrupedException異常。
static boolean interrupted():測試目前執行緒(目前正在執行指令的這個執行緒)是否被中斷。注意這是個靜態方法,呼叫這個方法會產生一個副作用就是它會將目前執行緒的中斷狀態重設為false。
boolean isInterrupted():判斷執行緒是否被中斷,這個方法的呼叫不會產生副作用即不改變執行緒的目前中斷狀態。
static Thread currentThread() : 傳回代表目前執行緒的Thread物件。
守護程式
用來服務不是服務程序的其他所有目前程序下的所有執行緒
實作deamon.setDaemon(true)就行,要在執行緒開啟之前啟用
範例
package com.orange.util; /** * * @ClassName: Test * @Description: TODO * @author Mr.jqCheng * @date 2018年9月26日 * */ public class Test { public static void main(String[] args) { Thread deamon2 = new Thread(new DaemonRunner2(), "otherRunner"); deamon2.start();// 启动线程 try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Thread deamon = new Thread(new DaemonRunner(), "DaemonRunner"); // 设置为守护线程 deamon.setDaemon(true); deamon.start();// 启动线程 } static class DaemonRunner implements Runnable { public void run() { // TODO Auto-generated method stub try { Thread.sleep(300); Thread t = Thread.currentThread(); System.out.println(t); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("进入守护线程,说明现在还有其他线程在执行"); } } } static class DaemonRunner2 implements Runnable { public void run() { // TODO Auto-generated method stub try { Thread.sleep(1500); System.out.println("我是其他线程"); } catch (Exception e) { e.printStackTrace(); } } } }
執行結果:
Thread[DaemonRunner,5,main]
進入守護線程,說明現在還有其他執行緒在執行
我是其他線程
首先,先啟動其他線程,需要耗時1500ms,同時,主線程耗時1000ms後,開始進入守護線程,此時其它線程還在運行,到了守護線程,耗時300ms,其他線程仍在執行,繼續往下,守護線程執行完畢
但是如果我把守護線程的300ms改成500ms,會發生什麼事呢?
出現過兩種情況,畢竟在臨界值
1.我是其他線程
2.Thread[DaemonRunner,5,main]
進入守護線程,說明現在還有其他執行緒在執行
我是其他執行緒
以上是Java多執行緒程式設計的方法總結(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!