網(wǎng)站開發(fā)建設(shè)培訓(xùn)推廣軟文300字
多線程
同時執(zhí)行多個任務(wù),例如一個人一邊聽歌,一邊跳舞
繼承Thread類實(shí)現(xiàn)多線程的方式
定義一個MyThread類繼承Thread類,重寫里面的run方法
package com.itxs.demo01;/*** @Classname : MyThread* @Description : TODO 自定義線程繼承Thread類* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread{@Overridepublic void run() {//super.run();for (int i = 0; i < 20; i++) {System.out.println("i = " + i);}}
}
測試多線程類
package com.itxs.demo01;/*** @Classname : demo01* @Description : TODO 多線程的測試類* @Author : lin_refuel@qq.com*/
public class demo01 {public static void main(String[] args) {// 線程對象創(chuàng)建MyThread my01 = new MyThread();MyThread my02 = new MyThread();MyThread my03 = new MyThread();MyThread my04 = new MyThread();//開啟線程的方法startmy01.start();my02.start();my03.start();my04.start();}
}
線程名字的獲取和設(shè)置
自定義線程繼承Thread類
package com.itxs.demo02;/*** @Classname : MyThread* @Description : TODO 自定義線程 - 繼承Thread類* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread {public MyThread() {}public MyThread(String name) {super(name);}@Overridepublic void run() {for (int i = 0; i < 20; i++) {// this.getName獲取類中自己的Name值System.out.println(this.getName() + " i =" + i);}}
}
測試線程
package com.itxs.demo02;/*** @Classname : demo01* @Description : TODO 多線程名字設(shè)置的方式* @Author : lin_refuel@qq.com*/
public class demo01 {public static void main(String[] args) {//創(chuàng)建線程對象// 方式一:通過構(gòu)造方法進(jìn)行設(shè)置每個線程名字MyThread my01 = new MyThread("線程01");MyThread my02 = new MyThread("線程02");MyThread my03 = new MyThread("線程03");MyThread my04 = new MyThread();// 方式二:通過方法setName設(shè)置線程名字
// my01.setName("線程01");
// my02.setName("線程02");
// my03.setName("線程03");my04.setName("線程04");//開啟線程my01.start();my02.start();my03.start();my04.start();}
}
運(yùn)行結(jié)果:
獲取正在運(yùn)行的線程對象
獲取正在運(yùn)行的線程
Thread.currentThread()
通過上面的方法,獲取到每個運(yùn)行線程的名字
package com.itxs.demo02;/*** @Classname : MyThread* @Description : TODO 自定義線程(輸出0-19) - 繼承Thread類* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread {public MyThread() {}public MyThread(String name) {super(name);}@Overridepublic void run() {for (int i = 0; i < 20; i++) {// this.getName獲取類中自己的Name值System.out.println(Thread.currentThread().getName() + " i =" + i);}}
}
package com.itxs.demo02;/*** @Classname : demo03* @Description : TODO 獲取每個正在運(yùn)行的線程的方法* @Author : lin_refuel@qq.com*/
public class demo03 {public static void main(String[] args) {// 創(chuàng)建幾個線程對象,設(shè)置每個線程的名字MyThread my01 = new MyThread("多線程01");MyThread my02 = new MyThread("多線程02");MyThread my03 = new MyThread("多線程03");MyThread my04 = new MyThread("多線程04");//開啟線程my01.start();my02.start();my03.start();my04.start();// main 其實(shí)也是一個線程,但是卻是主線程// 輸出0-19//設(shè)置主線程名字的方法 Thread.currentThread是獲取正在運(yùn)行的線程//setName是設(shè)置名字Thread.currentThread().setName("主線程");for (int i = 0; i < 20; i++) {System.out.println( Thread.currentThread().getName()+"i = " + i);}}
}
線程調(diào)度
-
兩種線程調(diào)度模型
-
分時調(diào)度模型:所有線程輪流使用 CPU 的使用權(quán),平均分配每個線程占用 CPU 的時間
-
搶占調(diào)度模型:優(yōu)先讓優(yōu)先級高的線程使用 CPU,如果線程的歐優(yōu)先級相同,那么隨機(jī)選擇一個,優(yōu)先級高的線程獲取的 CPU 占用時間會相對多一丟丟丟丟丟……
Java 使用的是搶占式的調(diào)度模型
-
線程優(yōu)先級設(shè)置
-
Thread 類中設(shè)置和獲取線程優(yōu)先級的方法
-
public final int getPriority()
:返回次線程的優(yōu)先級 -
public final void setProiority(int newPriority)
:更改次線程的優(yōu)先級
-
自定義的線程類-繼承Thread類
package com.itxs.demo02;/*** @Classname : MyThread* @Description : TODO 自定義線程(輸出0-19) - 繼承Thread類* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread {public MyThread() {}public MyThread(String name) {super(name);}@Overridepublic void run() {for (int i = 0; i < 20; i++) {// this.getName獲取類中自己的Name值System.out.println(Thread.currentThread().getName() + " i =" + i);}}
}
優(yōu)先級測試
package com.itxs.demo02;/*** @Classname : demo02* @Description : TODO 線程調(diào)度測試* @Author : lin_refuel@qq.com*/
public class demo02 {public static void main(String[] args) {// 創(chuàng)建線程對象MyThread mt01 = new MyThread("線程01");MyThread mt02 = new MyThread("線程02");MyThread mt03 = new MyThread("線程03");//修改線程的優(yōu)先級mt01.setPriority(Thread.MIN_PRIORITY);//1mt02.setPriority(Thread.NORM_PRIORITY);//5mt03.setPriority(Thread.MAX_PRIORITY);//10// 線程的優(yōu)先級輸出
// System.out.println(mt01.getPriority());
// System.out.println(mt02.getPriority());
// System.out.println(mt03.getPriority());//開啟線程測試那個線程優(yōu)先完成mt03.start();mt02.start();mt01.start();}
}
線程控制
方法名 | 說明 |
---|---|
static void sleep(long ms) | 使當(dāng)前正在執(zhí)行的線程停留指定的毫秒數(shù) |
void join() | 等待這個進(jìn)程死亡 |
void setDaemon(boolean on) | 將此線程標(biāo)記為守護(hù)進(jìn)程,當(dāng)運(yùn)行線程都是守護(hù)線程時,JVM 將退出 |
sleep方法
案例:華山論劍
自定義線程類
package com.itxs.demo02;/*** @Classname : MyThread* @Description : TODO 自定義一個線程 - 繼承Thread類* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread{public MyThread() {}public MyThread(String name) {super(name);}@Overridepublic void run() {for (int i = 1; i <=20 ; i++) {System.out.println(Thread.currentThread().getName() + "出了第"+i+"招");try {Thread.sleep(1000);//停留一秒} catch (InterruptedException e) {e.printStackTrace();}}}
}
sleep測試類
package com.itxs.demo02;/*** @Classname : demo02* @Description : TODO 線程測試 - sleep* @Author : lin_refuel@qq.com*/
public class demo02 {public static void main(String[] args) {//創(chuàng)建線程對象MyThread mt01 = new MyThread("黃固");MyThread mt02 = new MyThread("歐陽鋒");MyThread mt03 = new MyThread("段智興");MyThread mt04 = new MyThread("洪七公");//開啟線程mt01.start();mt02.start();mt03.start();mt04.start();}
}
join方法
歌曲《天下》,原唱:張杰,翻唱:池瑤和高魚
package com.itxs.demo03;/*** @Classname : MyThread* @Description : TODO* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread {public MyThread() {super();}public MyThread(String name) {super(name);}// 定義一個數(shù)組存放歌詞String[] song = {"烽煙起尋愛似浪淘沙","遇見她如春水映梨花","揮劍斷天涯","相思輕放下"};@Overridepublic void run() {for (int i = 0; i < song.length; i++) {System.out.println(Thread.currentThread().getName() + "正在唱:" + song[i]);}}
}
測試-張杰唱完后,兩個翻唱繼續(xù)唱
package com.itxs.demo03;/*** @Classname : demo01* @Description : TODO* @Author : lin_refuel@qq.com*/
public class demo01 {public static void main(String[] args) throws InterruptedException {//創(chuàng)建線程MyThread mt01 = new MyThread("張杰");MyThread mt02 = new MyThread("池瑤");MyThread mt03 = new MyThread("高魚");//開啟線程mt01.start();mt01.join();//等待張杰唱完,mt01執(zhí)行完后執(zhí)行后面的線程mt02.start();mt03.start();}
}
setDaemon()
守護(hù)線程,總結(jié)就是當(dāng)創(chuàng)建的線程對象設(shè)置為守護(hù)線程后,主線程里面的內(nèi)容執(zhí)行完后,所有開啟的多線程都會停止執(zhí)行
自定義的線程,執(zhí)行20次循環(huán)
package com.itxs.demo04;/*** @Classname : MyThread* @Description : TODO - 自定義線程* @Author : lin_refuel@qq.com*/
public class MyThread extends Thread{public MyThread() {super();}public MyThread(String name) {super(name);}@Overridepublic void run() {for (int i = 0; i < 20; i++) {System.out.println(Thread.currentThread().getName()+"報(bào)數(shù):"+i);}}
}
測試守護(hù)線程
package com.itxs.demo04;/*** @Classname : demo01* @Description : TODO* @Author : lin_refuel@qq.com*/
public class demo01 {public static void main(String[] args) {//創(chuàng)建線程對象MyThread mt01 = new MyThread("1號");MyThread mt02 = new MyThread("2號");MyThread mt03 = new MyThread("3號");System.out.println("開始報(bào)數(shù)");//mt01,02,03設(shè)置為守護(hù)線程mt01.setDaemon(true);mt02.setDaemon(true);mt03.setDaemon(true);// 線程開啟mt01.start();mt02.start();mt03.start();// 主線程執(zhí)行三次循環(huán)for (int i = 0; i < 3; i++) {System.out.println("報(bào)數(shù)中");}System.out.println("停止報(bào)數(shù)");}
}
線程的生命周期
-
新建:創(chuàng)建線程對象(通過
start()
進(jìn)入下一個環(huán)節(jié)) -
就緒:有執(zhí)行資格,沒有執(zhí)行權(quán)(搶占 CPU 的執(zhí)行權(quán))
-
運(yùn)行:有執(zhí)行資格,有執(zhí)行權(quán)(可能被其他線程搶走 CPU 的執(zhí)行權(quán),則回到就緒狀態(tài),若遇到阻塞式方法,則失去運(yùn)行權(quán)和執(zhí)行這個,等待,當(dāng)阻塞方法調(diào)用結(jié)束之后,回到就緒狀態(tài))
-
死亡:線程死亡,成為垃圾