auto.js停止所有线程_十年架构师带你快速上手多线程
這世上有三樣東西是別人搶不走的:一是吃進胃里的食物,二是藏在心中的夢想,三是讀進大腦的書
多線程快速入門
1、線程與進程區別
- 每個正在系統上運行的程序都是一個進程。每個進程包含一到多個線程。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨立執行。 所以線程基本上是輕量級的進程,它負責在單個程序里執行多任務。通常由操作系統負責多個線程的調度和執行。
- 使用線程可以把占據時間長的程序中的任務放到后臺去處理,程序的運行速度可能加快,在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內存占用等等。
- 如果有大量的線程,會影響性能,因為操作系統需要在它們之間切換,更多的線程需要更多的內存空間,線程的中止需要考慮其對程序運行的影響。通常塊模型數據是在多個線程間共享的,需要防止線程死鎖情況的發生。
- 總結:進程是所有線程的集合,每一個線程是進程中的一條執行路徑。
2、為什么要使用多線程?
- (1)、使用多線程可以減少程序的響應時間。單線程如果遇到等待或阻塞,將會導致程序不響應鼠標鍵盤等操作,使用多線程可以解決此問題,增強程序的交互性。
- (2)、與進程相比,線程的創建和切換開銷更小,因為線程共享代碼段、數據段等內存空間。
- (3)、多核CPU,多核計算機本身就具有執行多線程的能力,如果使用單個線程,將無法重復利用計算資源,造成資源的巨大浪費。
- (4)、多線程可以簡化程序的結構,使程序便于維護,一個非常復雜的進程可以分為多個線程執行。
3、多線程應用場景?
- 答:主要能體現到多線程提高程序效率。
- 舉例: 迅雷多線程下載、數據庫連接池、分批發送短信等。
4、多線程創建方式
第一種、 繼承Thread類 重寫run方法
class CreateThread extends Thread { // run方法中編寫 多線程需要執行的代碼 publicvoid run() { for (inti = 0; i< 10; i++) { System.out.println("i:" + i); } }}publicclass ThreadDemo { publicstaticvoid main(String[] args) { System.out.println("-----多線程創建開始-----"); // 1.創建一個線程 CreateThread createThread = new CreateThread(); // 2.開始執行線程 注意 開啟線程不是調用run方法,而是start方法 System.out.println("-----多線程創建啟動-----"); createThread.start(); System.out.println("-----多線程創建結束-----"); }}- 調用start方法后,代碼并沒有從上往下執行,而是有一條新的執行分支
- 注意:畫圖演示多線程不同執行路徑。
第二種、實現Runnable接口,重寫run方法
class CreateRunnable implements Runnable { @Override publicvoid run() { for (inti = 0; i< 10; i++) { System.out.println("i:" + i); } }}publicclass ThreadDemo2 { publicstaticvoid main(String[] args) { System.out.println("-----多線程創建開始-----"); // 1.創建一個線程 CreateRunnable createThread = new CreateRunnable(); // 2.開始執行線程 注意 開啟線程不是調用run方法,而是start方法 System.out.println("-----多線程創建啟動-----"); Thread thread = new Thread(createThread); thread.start(); System.out.println("-----多線程創建結束-----"); }}第三種、使用匿名內部類方式
System.out.println("-----多線程創建開始-----"); Thread thread = new Thread(new Runnable() { public void run() { for (int i = 0; i< 10; i++) { System.out.println("i:" + i); } } }); thread.start(); System.out.println("-----多線程創建結束-----");5、使用繼承Thread類還是使用實現Runnable接口好?
- 使用實現實現Runnable接口好,原因實現了接口還可以繼續繼承,繼承了類不能再繼承。
6、啟動線程是使用調用start方法還是run方法?
- 開始執行線程 注意 開啟線程不是調用run方法,而是start方法調用run知識使用實例調用方法。
7、獲取線程對象以及名稱
常用線程api方法start()啟動線程currentThread()獲取當前線程對象getID()獲取當前線程ID Thread-編號 該編號從0開始getName()獲取當前線程名稱sleep(long mill)休眠線程Stop()停止線程,常用線程構造函數Thread()分配一個新的 Thread 對象Thread(String name)分配一個新的 Thread對象,具有指定的 name正如其名。Thread(Runable r)分配一個新的 Thread對象Thread(Runable r, String name)分配一個新的 Thread對象
8、守護線程
- Java中有兩種線程,一種是用戶線程,另一種是守護線程。
- 用戶線程是指用戶自定義創建的線程,主線程停止,用戶線程不會停止
- 守護線程當進程不存在或主線程停止,守護線程也會被停止。
- 使用setDaemon(true)方法設置為守護線程
9、多線程運行狀態
- 線程從創建、運行到結束總是處于下面五個狀態之一:新建狀態、就緒狀態、運行狀態、阻塞狀態及死亡狀態
新建狀態
- 當用new操作符創建一個線程時, 例如new Thread(r),線程還沒有開始運行,此時線程處在新建狀態。 當一個線程處于新生狀態時,程序還沒有開始運行線程中的代碼
就緒狀態
- 一個新創建的線程并不自動開始運行,要執行線程,必須調用線程的start()方法。當線程對象調用start()方法即啟動了線程,start()方法創建線程運行的系統資源,并調度線程運行run()方法。當start()方法返回后,線程就處于就緒狀態。
- 處于就緒狀態的線程并不一定立即運行run()方法,線程還必須同其他線程競爭CPU時間,只有獲得CPU時間才可以運行線程。因為在單CPU的計算機系統中,不可能同時運行多個線程,一個時刻僅有一個線程處于運行狀態。因此此時可能有多個線程處于就緒狀態。對多個處于就緒狀態的線程是由Java運行時系統的線程調度程序(thread scheduler)來調度的。
運行狀態
- 當線程獲得CPU時間后,它才進入運行狀態,真正開始執行run()方法.
- 阻塞狀態線程運行過程中,可能由于各種原因進入阻塞狀態:
- 3>線程試圖得到一個鎖,而該鎖正被其他線程持有;
- 4>線程在等待某個觸發條件;
死亡狀態
- 有兩個原因會導致線程死亡:
- 為了確定線程在當前是否存活著(就是要么是可運行的,要么是被阻塞了),需要使用isAlive方法。如果是可運行或被阻塞,這個方法返回true; 如果線程仍舊是new狀態且不是可運行的, 或者線程死亡了,則返回false.
join()方法作用
- 當在主線程當中執行到t1.join()方法時,就認為主線程應該把執行權讓給t1
創建一個線程,子線程執行完畢后,主線程才能執行。
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + "i:" + i);
}
}
});
t1.start();
// 當在主線程當中執行到t1.join()方法時,就認為主線程應該把執行權讓給t1
t1.join();
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println("main" + "i:" + i);
}
- 優先級
- 現代操作系統基本采用時分的形式調度運行的線程,線程分配得到的時間片的多少決定了線程使用處理器資源的多少,也對應了線程優先級這個概念。在JAVA線程中,通過一個int priority來控制優先級,范圍為1-10,其中10最高,默認值為5。下面是源碼(基于1.8)中關于priority的一些量和方法。
Yield方法
Thread.yield()方法的作用:暫停當前正在執行的線程,并執行其他線程。(可能沒有效果)
yield()讓當前正在運行的線程回到可運行狀態,以允許具有相同優先級的其他線程獲得運行的機會。因此,使用yield()的目的是讓具有相同優先級的線程之間能夠適當的輪換執行。但是,實際中無法保證yield()達到讓步的目的,因為,讓步的線程可能被線程調度程序再次選中。
結論:大多數情況下,yield()將導致線程從運行狀態轉到可運行狀態,但有可能沒有效果。
總結
- 1.進程與線程的區別?
- 答:進程是所有線程的集合,每一個線程是進程中的一條執行路徑,線程只是一條執行路徑。
- 2.為什么要用多線程?
- 答:提高程序效率
- 3.多線程創建方式?
- 答:繼承Thread或Runnable 接口。
- 4.是繼承Thread類好還是實現Runnable接口好?
- 答:Runnable接口好,因為實現了接口還可以繼續繼承。繼承Thread類不能再繼承。
- 5.你在哪里用到了多線程?
- 答:主要能體現到多線程提高程序效率。
- 舉例:分批發送短信、迅雷多線程下載等。
總結
以上是生活随笔為你收集整理的auto.js停止所有线程_十年架构师带你快速上手多线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电路邱关源第五版pdf_硬件狗教你学电路
- 下一篇: python哪些模块用于数据分析_pyt