詳解Java線程的創(chuàng)建及休眠
一、進程vs線程
- 1、進程是系統(tǒng)分配資源的最小單位;線程是系統(tǒng)調(diào)度的最小單位
- 2、一個進程中至少要包含一個線程
- 3、線程必須要依附于繼承,線程是進程實質(zhì)工作的一個最小單位
二、線程的創(chuàng)建方式
繼承Thread類 實現(xiàn)線程的創(chuàng)建(2種寫法)
1種寫法
public class ThreadDemo03 {
static class MyThread extends Thread{
@Override
public void run(){
System.out.println("線程名稱:" +
Thread.currentThread().getName());
}
}
public static void main(String[] args) {
// 創(chuàng)建了線程
Thread t1 = new MyThread();
// 啟動線程
t1.start();
System.out.println("當(dāng)前線程的名稱(主線程):" +
Thread.currentThread().getName());
}
}
2種寫法
public class ThreadDemo04 {
public static void main(String[] args) {
Thread thread = new Thread(){
@Override
public void run() {
System.out.println("線程名:" +
Thread.currentThread().getName());
}
};
thread.start();
}
}
繼承Thread類的創(chuàng)建方式的缺點:在Java語言設(shè)計當(dāng)中只能實現(xiàn)單繼承,如果繼承了Thread類,就不能繼承其他類了,所以這種創(chuàng)建方式在開發(fā)中使用。
三、實現(xiàn)Runnable接口的方式(3種)
在Java中不能實現(xiàn)多繼承,但是可以實現(xiàn)多接口
1種方法
public class ThreadDemo05 {
static class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("線程名:" +
Thread.currentThread().getName());
}
}
public static void main(String[] args) {
// 1、新建Runnable類
MyRunnable runnable = new MyRunnable();
// 2、新建Thread
Thread thread = new Thread(runnable);
// 3、啟動線程
thread.start();
}
}
2種方法
public class ThreadDemo06 {
public static void main(String[] args) {
// 匿名內(nèi)部類的方式實現(xiàn)線程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("線程名:" +
Thread.currentThread().getName());
}
});
thread.start();
}
}
3種方法
/**
* 使用拉姆達表達式的方式創(chuàng)建
* **/
public class ThreadDemo07 {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
System.out.println("線程名: "+
Thread.currentThread().getName());
});
thread.start();
}
}
四、實現(xiàn)Callable接口的方式(1種)
為了拿到執(zhí)行完線程后可以得到返回值的方法
package Thread;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 創(chuàng)建并得到線程執(zhí)行的結(jié)果
* 實現(xiàn)Callable 接口 + Future容器 的方式
* */
public class ThreadDemo08 {
static class MyCallable implements Callable<Integer >{ // 想要返回的是Integer類型
@Override
public Integer call() throws Exception {
// 生成一個隨機數(shù)
int num = new Random().nextInt(10);
System.out.println("子線程:" +
Thread.currentThread().getName() +
"隨機數(shù):" + num);
return num;
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 1、創(chuàng)建一個Callable
MyCallable myCallable = new MyCallable();
// 2、創(chuàng)建一個FutureTask 對象來接受返回值
FutureTask<Integer> futureTask =
new FutureTask<>(myCallable);
// 3、創(chuàng)建Thread
Thread thread = new Thread(futureTask);
// 啟動線程
thread.start();
// 得到線程執(zhí)行結(jié)果
int result = futureTask.get();
System.out.println(String.format("線程名:%s,數(shù)字:%d",
Thread.currentThread().getName(), result));
}
}
五、線程的休眠
- 1、
Thread.sleep()
- 2、
TimeUnit.SECONDS.sleep(1)休眠一秒鐘 - 其中可選的有
DAYS表示天,HOURS表示小時
- 3、Thread.sleep(TimeUnit.SECONDS.toMillis(1))
練習(xí):使用連個線程來打印“AABBCCDD”,一個線程只能打印"ABCD"
package Thread;
public class ThreadDemo09 {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
String data = "ABCD";
for (char item:data.toCharArray()) {
System.out.print(item);
try {
// 休眠一段時間
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
}
}
六、線程優(yōu)先級
默認優(yōu)先級為5
最小優(yōu)先級為1
最大優(yōu)先級為10
優(yōu)先級越大那么它的執(zhí)行權(quán)重越高
理論上優(yōu)先級越高,執(zhí)行權(quán)限也就越大,但是CPU的調(diào)度實很復(fù)雜的,所以不會嚴格按照優(yōu)先級的排序去執(zhí)行,但總體還是優(yōu)先級越高,執(zhí)行權(quán)重越高
七、守護線程
守護線程使用場景:Java垃圾回收器、TCP的健康檢測
守護線程需要注意的事項:
- 1、守護線程必須設(shè)置在Thread.start()之前,如果設(shè)置守護線程再開始線程之后,那么程序就會報錯,并且設(shè)置的守護線程值不能生效
- 2、在守護線程t1內(nèi)部創(chuàng)建一個新的線程t2,此時t2默認情況下也是守護線程
到此這篇關(guān)于詳解Java線程的創(chuàng)建及休眠的文章就介紹到這了,更多相關(guān)Java線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+MinIO實現(xiàn)對象存儲的示例詳解
MinIO?是一個基于Apache?License?v2.0開源協(xié)議的對象存儲服務(wù),它是一個非常輕量的服務(wù),可以很簡單的和其他應(yīng)用的結(jié)合,所以下面我們就來看看SpringBoot如何整合MinIO實現(xiàn)對象存儲吧2023-10-10
使用maven-assembly-plugin如何打包多模塊項目
這篇文章主要介紹了使用maven-assembly-plugin如何打包多模塊項目,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
idea神級插件及如何安裝Bito插件【Bito-ChatGPT】
這篇文章主要介紹了介紹一款idea神級插件【Bito-ChatGPT】,Bito插件的強大之處在于它可以幫助開發(fā)人員更快地提交代碼,同時還提供了一些有用的功能,如自動補全提交信息、快速查看歷史記錄等,需要的朋友可以參考下2023-04-04
linux環(huán)境下java程序打包成簡單的hello world輸出jar包示例
這篇文章主要介紹了linux環(huán)境下java程序打包成簡單的hello world輸出jar包,結(jié)合簡單hello world輸出程序示例分析了Linux環(huán)境下的java可執(zhí)行jar包文件的生成相關(guān)操作技巧,需要的朋友可以參考下2019-11-11

