詳解Java線程的創(chuàng)建及休眠
一、進(jìn)程vs線程
- 1、進(jìn)程是系統(tǒng)分配資源的最小單位;線程是系統(tǒng)調(diào)度的最小單位
- 2、一個(gè)進(jìn)程中至少要包含一個(gè)線程
- 3、線程必須要依附于繼承,線程是進(jìn)程實(shí)質(zhì)工作的一個(gè)最小單位
二、線程的創(chuàng)建方式
繼承Thread類 實(shí)現(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(); // 啟動(dòng)線程 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)建方式的缺點(diǎn):在Java語言設(shè)計(jì)當(dāng)中只能實(shí)現(xiàn)單繼承,如果繼承了Thread類,就不能繼承其他類了,所以這種創(chuàng)建方式在開發(fā)中使用。
三、實(shí)現(xiàn)Runnable接口的方式(3種)
在Java中不能實(shí)現(xiàn)多繼承,但是可以實(shí)現(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、啟動(dòng)線程 thread.start(); } }
2種方法
public class ThreadDemo06 { public static void main(String[] args) { // 匿名內(nèi)部類的方式實(shí)現(xiàn)線程 Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("線程名:" + Thread.currentThread().getName()); } }); thread.start(); } }
3種方法
/** * 使用拉姆達(dá)表達(dá)式的方式創(chuàng)建 * **/ public class ThreadDemo07 { public static void main(String[] args) { Thread thread = new Thread(() -> { System.out.println("線程名: "+ Thread.currentThread().getName()); }); thread.start(); } }
四、實(shí)現(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é)果 * 實(shí)現(xiàn)Callable 接口 + Future容器 的方式 * */ public class ThreadDemo08 { static class MyCallable implements Callable<Integer >{ // 想要返回的是Integer類型 @Override public Integer call() throws Exception { // 生成一個(gè)隨機(jī)數(shù) int num = new Random().nextInt(10); System.out.println("子線程:" + Thread.currentThread().getName() + "隨機(jī)數(shù):" + num); return num; } } public static void main(String[] args) throws ExecutionException, InterruptedException { // 1、創(chuàng)建一個(gè)Callable MyCallable myCallable = new MyCallable(); // 2、創(chuàng)建一個(gè)FutureTask 對(duì)象來接受返回值 FutureTask<Integer> futureTask = new FutureTask<>(myCallable); // 3、創(chuàng)建Thread Thread thread = new Thread(futureTask); // 啟動(dòng)線程 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
表示小時(shí)
- 3、Thread.sleep(TimeUnit.SECONDS.toMillis(1))
練習(xí):使用連個(gè)線程來打印“AABBCCDD”,一個(gè)線程只能打印"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 { // 休眠一段時(shí)間 Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } }; Thread t1 = new Thread(runnable); Thread t2 = new Thread(runnable); t1.start(); t2.start(); } }
六、線程優(yōu)先級(jí)
默認(rèn)優(yōu)先級(jí)為5
最小優(yōu)先級(jí)為1
最大優(yōu)先級(jí)為10
優(yōu)先級(jí)越大那么它的執(zhí)行權(quán)重越高
理論上優(yōu)先級(jí)越高,執(zhí)行權(quán)限也就越大,但是CPU的調(diào)度實(shí)很復(fù)雜的,所以不會(huì)嚴(yán)格按照優(yōu)先級(jí)的排序去執(zhí)行,但總體還是優(yōu)先級(jí)越高,執(zhí)行權(quán)重越高
七、守護(hù)線程
守護(hù)線程使用場景:Java垃圾回收器、TCP的健康檢測
守護(hù)線程需要注意的事項(xiàng):
- 1、守護(hù)線程必須設(shè)置在Thread.start()之前,如果設(shè)置守護(hù)線程再開始線程之后,那么程序就會(huì)報(bào)錯(cuò),并且設(shè)置的守護(hù)線程值不能生效
- 2、在守護(hù)線程t1內(nèi)部創(chuàng)建一個(gè)新的線程t2,此時(shí)t2默認(rèn)情況下也是守護(hù)線程
到此這篇關(guān)于詳解Java線程的創(chuàng)建及休眠的文章就介紹到這了,更多相關(guān)Java線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Rest的API解決方案(jersey與swagger集成)
下面小編就為大家?guī)硪黄赗est的API解決方案(jersey與swagger集成)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08java并發(fā)高的情況下用ThreadLocalRandom來生成隨機(jī)數(shù)
如果我們想要生成一個(gè)隨機(jī)數(shù),通常會(huì)使用Random類。但是在并發(fā)情況下Random生成隨機(jī)數(shù)的性能并不是很理想,本文主要介紹了java并發(fā)高的情況下用ThreadLocalRandom來生成隨機(jī)數(shù),感興趣的可以了解一下2022-05-05Java SpringBoot安全框架整合Spring Security詳解
這篇文章主要介紹了Spring Boot整合Spring Security的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2021-09-09SpringBoot如何優(yōu)雅的實(shí)現(xiàn)重試功能
這篇文章主要詳細(xì)介紹了SpringBoot如何優(yōu)雅的實(shí)現(xiàn)重試功能的步驟詳解,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,感興趣的同學(xué)可以借鑒閱讀2023-06-06k8s解決java服務(wù)下載超時(shí)問題小結(jié)
我們?cè)谧遡ngress的java程序的時(shí)候,往往會(huì)有導(dǎo)出數(shù)據(jù)的功能,這個(gè)時(shí)候就會(huì)有因網(wǎng)絡(luò)慢、后臺(tái)處理時(shí)間過長導(dǎo)致下載超時(shí),也有因下載文件太大,導(dǎo)致下載失敗,下面給分享k8s解決java服務(wù)下載超時(shí)問題,感興趣的朋友跟隨小編一起看看吧2024-06-06