創(chuàng)建java多線程程序
創(chuàng)建多線程程序的第一種方式:創(chuàng)建Thread類的子類
java.lang.Thread類:是描述線程的類,我們想要實現(xiàn)多線程程序,就必須繼承Thread類
實現(xiàn)步驟:
- 創(chuàng)建一個Thread類的子類
- 在Thread類的子類中重寫Thread類中的run方法,設(shè)置線程任務(wù)(開啟線程要做什么?)
- 創(chuàng)建Thread類的子類對象
- 調(diào)用Thread類中的方法start方法,開啟新的線程,執(zhí)行run方法
void start()使該線程開始執(zhí)行;Java虛擬機(jī)調(diào)用該線程的run方法。
結(jié)果是兩個線程并發(fā)地運(yùn)行﹔當(dāng)前線程〈main線程〉和另一個線程〈創(chuàng)建的新線程,執(zhí)行其run方法)。
多次啟動一個線程是非法的(只能調(diào)用一次start方法)。特別是當(dāng)線程已經(jīng)結(jié)束執(zhí)行后,不能再重新啟動。
java程序?qū)儆趽屨际秸{(diào)度,那個線程的優(yōu)先級高,那個線程優(yōu)先執(zhí)行;同一個優(yōu)先級,隨機(jī)選擇一個執(zhí)行
public class threadex extends Thread{
public void run(){
for (int i = 0; i < 20; i++) {
System.out.println("run"+i);
}
}
}
public class thread {
public static void main(String[] args) {
threadex mt=new threadex();
mt.start();
for (int i = 0 ; i < 20; i++) {
System.out.println("main"+i);
}
}
}
最終結(jié)果是隨機(jī)的:

多線程隨機(jī)性原理:


創(chuàng)建多線程程序的第二種方式:實現(xiàn)RunnabLe接口
java.Lang.Runnable
Runnable接口應(yīng)該由那些打算通過某一線程執(zhí)行其實例的類來實現(xiàn)。類必須定義一個稱為run的無參數(shù)方法。
java.Lang.Thread類的構(gòu)造方法
Thread ( Runnable target)分配新的 Thread 對象。
Thread ( Runnable target, string name)分配新的Thread 對象。
實現(xiàn)步驟:
- 創(chuàng)建一個Runnable接口的實現(xiàn)類
- 在實現(xiàn)類中重寫Runnable接口的run方法,設(shè)置線程任務(wù)
- 創(chuàng)建一個Runnable接口的實現(xiàn)類對象
- 創(chuàng)建Thread類對象,構(gòu)造方法中傳遞Runnable接口的實現(xiàn)類對象
- 調(diào)用Thread類中的start方法,開啟新的線程執(zhí)行run方法
public class threadex2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
}
}
public class thread {
public static void main(String[] args) {
//第二種
threadex2 mt1=new threadex2();
Thread t=new Thread(mt1);
t.start();
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
}
}
結(jié)果同樣是隨機(jī)的:

實現(xiàn)Runnable接口創(chuàng)建多線程程序的好處:
1.避免了單繼承的局限性
一個類只能繼承一個類(一個人只能有一個親爹),類繼承了Thread類就不能繼承其他的類實現(xiàn)了Runnable接口,還可以繼承其他的類,實現(xiàn)其他的接口
2.增強(qiáng)了程序的擴(kuò)展性,降低了程序的耦合性(解耦)
實現(xiàn)Runnable接口的方式,把設(shè)置線程任務(wù)和開啟新線程進(jìn)行了分離(解耦)實現(xiàn)類中,重寫了run方法:用來設(shè)置線程任務(wù)
創(chuàng)建Thread類對象,調(diào)用start方法:用來開啟新線程
匿名內(nèi)部類方式實現(xiàn)線程的創(chuàng)建
匿名:沒有名字
內(nèi)部類:寫在其他類內(nèi)部的類
匿名內(nèi)部類作用:簡化代碼
把子類繼承父類,重寫父類的方法,創(chuàng)建子類對象合一步完成
把實現(xiàn)類實現(xiàn)接口,重寫接口中的方法,創(chuàng)建實現(xiàn)類對象合成一步完成
匿名內(nèi)部類的最終產(chǎn)物:子類/實現(xiàn)類對象,而這個類沒有名字
格式:
new 父類/接口 () {
重復(fù)父類/接口中的方法
};
public static void main(String[] args) {
new Thread(){
public void run(){
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+"cs"+i);
}
}
}.start();//Thread-0
//線程的接口Runnable
//Runnable r=new RunnableImpl();//多態(tài)
Runnable r=new Runnable(){
//重寫run方法,設(shè)置線程任務(wù)
public void run(){
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+"ff"+i);
}
}
};
new Thread(r).start();
//簡化
new Thread(new Runnable(){
//重寫run方法,設(shè)置線程任務(wù)
public void run(){
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+"hj"+i);
}
}
}).start();
}
Thread類中的常用方法:
獲取線程的名稱:
1.使用Thread類中的方法getName() String getName() 返回該線程的名稱。
2.可以先獲取到當(dāng)前正在執(zhí)行的線程,使用線程中的方法getName()獲取線程的名稱
static Thread currentThread()返回對當(dāng)前正在執(zhí)行的線程對象的引用。
//方法一
public class threadfun extends Thread{
public void run(){
String name = getName();
System.out.println(name);
}
}
/*
線程的名稱:
主線程: main
新線程:Thread-0, Thread-1 , Thread-2
*/
public class threadfunmain {
public static void main(String[] args) {
threadfun mt = new threadfun();
mt.start();//Thread-0
new threadfun().start();//Thread-1
new threadfun().start();//Thread-2
}
}
方法二:
public class threadfun extends Thread{
public void run(){
//方法二
Thread th = Thread.currentThread();
System.out.println(th);
String name = getName();
System.out.println(name);
//System.out.println(Thread.currentThread().getName());
}
}
public class threadfunmain {
public static void main(String[] args) {
threadfun mt = new threadfun();
mt.start();//Thread[Thread-0,5,main] Thread-0
new threadfun().start();//Thread[Thread-1,5,main] Thread-1
new threadfun().start();//Thread[Thread-2,5,main] Thread-2
System.out.println(Thread.currentThread().getName());//main
//主線程中只能用第二種方法獲取,因為測試類沒有繼承Thread類,沒有g(shù)etname方法
}
}
設(shè)置線程的名稱:(了解)
1.使用Thread類中的方法setName(名字)
void setName ( String name)改變線程名稱,使之與參數(shù)name相同。
2.創(chuàng)建一個帶參數(shù)的構(gòu)造方法,參數(shù)傳遞線程的名稱;調(diào)用父類的帶參構(gòu)造方法,把線程名稱傳遞給父類,讓父類(Thread)給子線程起一個名字
Thread ( String name)分配新的Thread 對象。
public class threadfun extends Thread{
public void run(){
//設(shè)置線程的名稱方法一
System.out.println(Thread.currentThread().getName());
}
//設(shè)置線程的名稱方法二
threadfun(){}
threadfun(String name){
super(name);
}
}
public class threadfunmain {
public static void main(String[] args) {
threadfun mt = new threadfun();
//設(shè)置線程的名稱方法一
mt.setName("ess");
mt.start();
//設(shè)置線程的名稱方法二
new threadfun("ff").start();
}
}
public static void sleep(Long millis):使當(dāng)前正在執(zhí)行的線程以指定的毫秒數(shù)暫停(暫時停止執(zhí)行)。毫秒數(shù)結(jié)束之后,線程繼續(xù)執(zhí)行
//sleep
for (int i = 0; i < 20; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
總結(jié):
這篇文章就到這里了,希望能夠給你帶來幫助,也希望大家能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
springboot前后端分離集成CAS單點(diǎn)登錄(統(tǒng)一認(rèn)證)
單點(diǎn)登錄是一種身份認(rèn)證和授權(quán)技術(shù),允許用戶在多個應(yīng)用系統(tǒng)中使用同一套用戶名和密碼進(jìn)行登錄,本文主要介紹了springboot前后端分離集成CAS單點(diǎn)登錄,具有一定的參考價值,感興趣的可以了解一下2024-09-09
Java多線程之JUC(java.util.concurrent)的常見類(多線程編程常用類)
這篇文章主要給大家介紹了關(guān)于Java多線程之JUC(java.util.concurrent)的常見類(多線程編程常用類)的相關(guān)資料,Java中的JUC(java.util.concurrent)包提供了一些并發(fā)編程中常用的類,這些類可以幫助我們更方便地實現(xiàn)多線程編程,需要的朋友可以參考下2024-02-02
解決dubbo啟動報服務(wù)注冊失敗Failed?to?register?dubbo
這篇文章主要介紹了解決dubbo啟動報服務(wù)注冊失敗Failed?to?register?dubbo問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Java生成訂單號或唯一id的高并發(fā)方案(4種方法)
本文主要介紹了Java生成訂單號或唯一id的高并發(fā)方案,包括4種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
SpringCloud Netflix Ribbon超詳細(xì)講解
這篇文章主要介紹了SpringCloud筆記HoxtonNetflix之Ribbon負(fù)載均衡,Ribbon是管理HTTP和TCP服務(wù)客戶端的負(fù)載均衡器,Ribbon具有一系列帶有名稱的客戶端(Named Client),對SpringCloud Ribbon負(fù)載均衡相關(guān)知識感興趣的朋友一起看看吧2022-10-10
如何基于springboot-admin實現(xiàn)后臺監(jiān)控
這篇文章主要介紹了如何基于springboot-admin實現(xiàn)后臺監(jiān)控,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04

