實例總結(jié)Java多線程編程的方法
1.什么時候使用多線程編程
一個任務(wù)在正常情況下是按順序執(zhí)行的,但是如果當(dāng)前任務(wù)里有多個相似進程塊(例如for,while語句),我們就可以考慮把這些代碼塊抽出來并行運行,無需阻塞
2.實現(xiàn)多線程的幾種方式
一種是繼承Thread類重寫run方法,另一種是實現(xiàn)Runnable接口重寫run方法
啟動多線程很多情況下是為了處理并發(fā)進程,此時對于部分實時性要求不是那么高的業(yè)務(wù)需求,我們還可以通過實現(xiàn)隊列的方式,異步實現(xiàn)。
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("我是繼承線程");
}
}
實現(xiàn)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("我是實現(xiàn)進程");
}
}
測試:
/**
*
* @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();// 啟動線程 // 實現(xiàn)Runnable啟動線程的方法
ThreadByRunnable r = new ThreadByRunnable();
Thread t2 = new Thread(r);
t2.start();// 啟動線程 //new ThreadByRunnable(); }
}
運行結(jié)果:
我是繼承線程
我是實現(xiàn)進程
ok,簡單的多線程實現(xiàn)方式完成了,在調(diào)用start()的時候,該進程已經(jīng)進入可執(zhí)行狀態(tài),等待系統(tǒng)執(zhí)行。
線程處理的幾個常用方法:
void interrupt():向線程發(fā)送中斷請求,線程的中斷狀態(tài)將會被設(shè)置為true,如果當(dāng)前線程被一個sleep調(diào)用阻塞,那么將會拋出interrupedException異常。
static boolean interrupted():測試當(dāng)前線程(當(dāng)前正在執(zhí)行命令的這個線程)是否被中斷。注意這是個靜態(tài)方法,調(diào)用這個方法會產(chǎn)生一個副作用那就是它會將當(dāng)前線程的中斷狀態(tài)重置為false。
boolean isInterrupted():判斷線程是否被中斷,這個方法的調(diào)用不會產(chǎn)生副作用即不改變線程的當(dāng)前中斷狀態(tài)。
static Thread currentThread() : 返回代表當(dāng)前執(zhí)行線程的Thread對象。
守護進程
用來服務(wù)于不是服務(wù)進程的其他所有當(dāng)前進程下的所有線程
實現(xiàn)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");
// 設(shè)置為守護線程
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("進入守護線程,說明現(xiàn)在還有其他線程在執(zhí)行");
}
}
}
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();
}
}
}
}
執(zhí)行結(jié)果:
Thread[DaemonRunner,5,main]
進入守護線程,說明現(xiàn)在還有其他線程在執(zhí)行
我是其他線程
首先,先啟動其他線程,需要耗時1500ms,同時,主線程耗時1000ms后,開始進入守護線程,此時其它線程還在運行,到了守護線程,耗時300ms,其他線程仍在執(zhí)行,繼續(xù)往下,守護線程執(zhí)行完畢
但是如果我把守護線程的300ms改成500ms,會發(fā)生什么事呢?
出現(xiàn)過兩種情況,畢竟在臨界值
1.我是其他線程
2.Thread[DaemonRunner,5,main]
進入守護線程,說明現(xiàn)在還有其他線程在執(zhí)行
我是其他線程
相關(guān)文章
Java購物系統(tǒng)設(shè)計與實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java購物系統(tǒng)設(shè)計與實現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
Java反射獲取所有Controller和RestController類的方法
這篇文章給大家分享了Java反射獲取所有Controller和RestController類的方法,文中有詳細(xì)的代碼示例講解,具有一定的參考價值,需要的朋友可以參考下2023-08-08
java執(zhí)行shell并獲取shell輸出日志方式
這篇文章主要介紹了java執(zhí)行shell并獲取shell輸出日志方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
logback ThrowableProxyConverter類源碼流程解析
這篇文章主要為大家介紹了logback ThrowableProxyConverter類源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12

