摘要:每個進程包含一到多個線程。所以線程基本上是輕量級的進程,它負責在單個程序里執行多任務。通常由操作系統負責多個線程的調度和執行。因此此時可能有多個線程處于就緒狀態。
進程和線程
每個正在系統上運行的程序都是一個進程。每個進程包含一到多個線程。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨立執行。也可以把它理解為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程序里執行多任務。通常由操作系統負責多個線程的調度和執行。
使用線程可以把占據時間長的程序中的任務放到后臺去處理,程序的運行速度可能加快,在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內存占用等等。
如果有大量的線程,會影響性能,因為操作系統需要在它們之間切換,更多的線程需要更多的內存空間,線程的中止需要考慮其對程序運行的影響。通常塊模型數據是在多個線程間共享的,需要防止線程死鎖情況的發生。
總結:進程是所有線程的集合,每一個線程是進程中的一條執行路徑。
推薦閱讀:http://www.ruanyifeng.com/blo...
后臺發送郵件或者短信
文件下載
數據庫連接池
創建方式 繼承Thread類 重寫run方法MyThread:
public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("i = " + i); } } }
測試接口:
@GetMapping("test-my-thread") public void testMyThead() { MyThread myThread = new MyThread(); System.out.println("start thread"); myThread.start(); System.out.println("end thread"); }
測試結果:
start thread
end thread
循環i
Runnable接口,重寫run方法Mythread2
public class Mythread2 implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("i = " + i); } } }
測試接口
@GetMapping("test-my-thread2") public void testMyThead2() { Mythread2 mythread2 = new Mythread2(); System.out.println("start thread"); new Thread(mythread2).start(); System.out.println("end thread"); }
測試結果:
start thread
end thread
循環i
使用匿名內部類方式測試接口
@GetMapping("test-my-thread3") public void testMyThead3() { new Thread(() -> { System.out.println("start thread"); for (int i = 0; i < 10; i++) { System.out.println("i = " + i); } System.out.println("end thread"); }).start(); }
測試結果:
start thread
end thread
循環i
常見問題繼承Thread?實現Runnable接口?
推薦使用實現Runnable接口,因為java是單繼承多實現的
start方法?run方法?
start開啟線程,等待cpu去執行;run是實例調用
Thread() 無參構造
Thread(String name) 指定Thread名稱
Thread(Runable r) 參數為Runable
Thread(Runable r, String name) 參數為Runable和Thread名稱
Thread關于自身信息的APIsetName(String name)/getName() 讀寫線程名稱
isDaemon() 判斷該線程是否是守護線程
getId() 獲取當前jvm中該線程的唯一標示
isAlive() 判斷該線程是否存活,標準是線程已啟動但還沒有執行完畢
getState() 獲取該線程狀態,返回值為枚舉,包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED
currentThread() 獲取當前線程對象
Thread關于執行的APIstart() 啟動線程
run() 實例方法執行線程代碼,并沒有啟動一個新的線程
join(long millis, int nanos) 保證指定時間以內,在JVM中只有該線程在運行。millis是等待的毫秒數,nanos是微秒數(參數可省)。如果millis填0,則一直等到當前線程執行完畢,JVM才會調度其他線程執行
yield() 當該線程讓出CPU,給其他線程一個獲取調度的機會,但是不確保一定會調度到其他線程上
sleep(long millis, int nanos) 讓該線程在指定時間以內休眠,需要注意的是在休眠過程中該線程不會釋放持有的鎖。millis是等待的毫秒數,nanos是微秒數(參數可省)
Stop() 停止線程
多線程運行狀態 新建狀態當用new操作符創建一個線程時, 例如new Thread(r),線程還沒有開始運行,此時線程處在新建狀態。 當一個線程處于新生狀態時,程序還沒有開始運行線程中的代碼就緒狀態
一個新創建的線程并不自動開始運行,要執行線程,必須調用線程的start()方法。當線程對象調用start()方法即啟動了線程,start()方法創建線程運行的系統資源,并調度線程運行run()方法。當start()方法返回后,線程就處于就緒狀態。 處于就緒狀態的線程并不一定立即運行run()方法,線程還必須同其他線程競爭CPU時間,只有獲得CPU時間才可以運行線程。因為在單CPU的計算機系統中,不可能同時運行多個線程,一個時刻僅有一個線程處于運行狀態。因此此時可能有多個線程處于就緒狀態。對多個處于就緒狀態的線程是由Java運行時系統的線程調度程序(thread scheduler)來調度的。運行狀態
當線程獲得CPU時間后,它才進入運行狀態,真正開始執行run()方法.阻塞狀態
線程運行過程中,可能由于各種原因進入阻塞狀態: 1. 線程通過調用sleep方法進入睡眠狀態; 2. 線程調用一個在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會返回到它的調用者; 3. 線程試圖得到一個鎖,而該鎖正被其他線程持有; 4. 線程在等待某個觸發條件;死亡狀態
有兩個原因會導致線程死亡: 1) run方法正常退出而自然死亡, 2) 一個未捕獲的異常終止了run方法而使線程猝死。 為了確定線程在當前是否存活著(就是要么是可運行的,要么是被阻塞了),需要使用isAlive方法。如果是可運行或被阻塞,這個方法返回true; 如果線程仍舊是new狀態且不是可運行的, 或者線程死亡了,則返回false.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74118.html
摘要:基礎知識復習后端掘金的作用表示靜態修飾符,使用修飾的變量,在中分配內存后一直存在,直到程序退出才釋放空間。將對象編碼為字節流稱之為序列化,反之將字節流重建成對象稱之為反序列化。 Java 學習過程|完整思維導圖 - 后端 - 掘金JVM 1. 內存模型( 內存分為幾部分? 堆溢出、棧溢出原因及實例?線上如何排查?) 2. 類加載機制 3. 垃圾回收 Java基礎 什么是接口?什么是抽象...
摘要:哪吒社區技能樹打卡打卡貼函數式接口簡介領域優質創作者哪吒公眾號作者架構師奮斗者掃描主頁左側二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領導們的談話,現在公司的現狀是碼農太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區Java技能樹打卡?【打卡貼 day2...
摘要:線程可以被稱為輕量級進程。一個守護線程是在后臺執行并且不會阻止終止的線程。其他的線程狀態還有,和。上下文切換是多任務操作系統和多線程環境的基本特征。在的線程中并沒有可供任何對象使用的鎖和同步器。 原文:Java Multi-Threading and Concurrency Interview Questions with Answers 翻譯:并發編程網 - 鄭旭東 校對:方騰飛 多...
摘要:多線程和并發問題是技術面試中面試官比較喜歡問的問題之一。線程可以被稱為輕量級進程。一個守護線程是在后臺執行并且不會阻止終止的線程。其他的線程狀態還有,和。上下文切換是多任務操作系統和多線程環境的基本特征。 多線程和并發問題是 Java 技術面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,但是你仍然應該牢固的掌握Java多線程基礎知識來對應日后碰到的問題。(...
閱讀 768·2021-09-26 09:55
閱讀 2058·2021-09-22 15:44
閱讀 1473·2019-08-30 15:54
閱讀 1324·2019-08-30 15:54
閱讀 2668·2019-08-29 16:57
閱讀 517·2019-08-29 16:26
閱讀 2490·2019-08-29 15:38
閱讀 2122·2019-08-26 11:48