Thread线程类及多线程
1.進(jìn)程、線程、并發(fā)、并行是什么?
1)進(jìn)程:操作系統(tǒng)中可以運(yùn)行多個(gè)任務(wù)(程序),這些運(yùn)行的任務(wù)(程序)被稱為進(jìn)程。程序的運(yùn)行產(chǎn)生進(jìn)程(內(nèi)存空間、程序執(zhí)行的堆棧),可以這樣說(shuō),進(jìn)程是作為操作系統(tǒng)分配資源的基本單位。
2)線程:程序里同時(shí)可能運(yùn)行多個(gè)任務(wù)(在一個(gè)CPU時(shí)間片內(nèi),順序執(zhí)行流),那么每個(gè)任務(wù)(順序執(zhí)行流)就叫做一個(gè)線程,即在線程內(nèi)部。
3)并發(fā):線程是并發(fā)運(yùn)行的。操作系統(tǒng)將時(shí)間化分為若干個(gè)片段(時(shí)間片),盡可能的均勻分配給每一個(gè)任務(wù),被分配時(shí)間片后,任務(wù)就有機(jī)會(huì)被cpu所執(zhí)行。微觀上看,每個(gè)任務(wù)都是走走停停的。但隨著cpu高效的運(yùn)行,宏觀上看所有任務(wù)都在運(yùn)行。這種都運(yùn)行的現(xiàn)象稱之為并發(fā),但不是絕對(duì)意義上的“同時(shí)發(fā)生”。
?4)并行:一個(gè)時(shí)間段,多個(gè)任務(wù)同時(shí)進(jìn)行,而且多個(gè)CPU運(yùn)行各自的進(jìn)程。
?2.多線程的實(shí)現(xiàn)
1)繼承Thread
?通過(guò)查閱JDK API文檔,Thread 類位于java.lang中,表示進(jìn)程中的執(zhí)行線程。實(shí)現(xiàn)多線程有兩種方式。第一是繼承Thread:
1 package cn.a1.a; 2 3 public class MyThread extends Thread { 4 5 @Override 6 public void run() { 7 System.out.println("這是多線程MyThread"); 8 for (int i = 0; i < 5; i++) { 9 System.out.println("MyThread:" + i); 10 } 11 12 } 13 } 1 package cn.a1.a; 2 3 public class Test1 { 4 public static void main(String[] args) { 5 // 創(chuàng)建一個(gè)多線程,此時(shí)已有兩個(gè)線程 主線程(main) 和 創(chuàng)建的線程 mThread1; 6 MyThread mThread1 = new MyThread(); 7 mThread1.start(); 8 9 // 查看主線程main是否運(yùn)行 10 for (int i = 0; i < 5; i++) { 11 System.out.println("main Thread:" + i); 12 } 13 14 } 15 16 }main線程和t1線程搶占CPU 執(zhí)行,輸出也是main線程和t1線程根據(jù)內(nèi)部搶占CPU 執(zhí)行輸出,不規(guī)則,多線程在提高CPU利用率的同時(shí),增加程序的復(fù)雜度。
main Thread:0 這是多線程MyThread main Thread:1 MyThread:0 main Thread:2 MyThread:1 main Thread:3 MyThread:2 MyThread:3 main Thread:4 MyThread:4?
2)實(shí)現(xiàn)Runnable接口
用于定義線程要執(zhí)行的任務(wù)邏輯。我們定一個(gè)類實(shí)現(xiàn)Runnable接口,這時(shí)我們必須重寫(xiě)run方法,在其中定義我們要執(zhí)行的邏輯。之后將Runnable交給線程去執(zhí)行。從而實(shí)現(xiàn)了線程與其執(zhí)行的任務(wù)分離開(kāi)。將任務(wù)分別交給不同的線程并發(fā)處理,可以使用線程的重載構(gòu)造方法:Thread(Runnable runnable)。解藕:線程與線程體解藕,即打斷依賴關(guān)系。 如果你學(xué)到Spring了就知道,Spring的ioc就是干這個(gè)的。
?演示:
1 package cn.a1.a1; 2 3 public class MyRun implements Runnable { 4 5 @Override 6 public void run() { 7 System.out.println("這是MyRun"); 8 9 for (int i = 0; i < 3; i++) { 10 System.out.println("MyRun:" + i); 11 } 12 } 13 }?
1 public class Test1 { 2 public static void main(String[] args) { 3 MyRun tRun1 = new MyRun(); 4 Thread t1 = new Thread(tRun1); 5 t1.start(); 6 //這里main開(kāi)始運(yùn)行也有產(chǎn)生一個(gè)進(jìn)程,該進(jìn)程有個(gè)主(main)線程 7 for (int i = 0; i < 3; i++) { 8 System.out.println("main"+i); 9 } 10 11 } 12 13 }輸出不規(guī)則的
main0 這是MyRun MyRun:0 main1 main2 MyRun:1 MyRun:2繼承Thread和實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)多線程的優(yōu)缺點(diǎn)
[1] 繼承Thread的線程類不能再繼承其他類,實(shí)現(xiàn)Runnable接口的類還可以繼承其他類。
[2] 實(shí)現(xiàn)Runnable接口的線程類,可以讓多個(gè)線程共享線程實(shí)現(xiàn)類的資源。
總結(jié):
多線程提高了cpu利用率,但程序的復(fù)雜度也隨之增加。一旦線程開(kāi)始執(zhí)行,很難通過(guò)其他方式控制線程的軌跡。
多個(gè)線程搶占CPU導(dǎo)致線程的運(yùn)行軌跡不確定。
轉(zhuǎn)載于:https://www.cnblogs.com/abcdjava/p/10840670.html
總結(jié)
以上是生活随笔為你收集整理的Thread线程类及多线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 7-2 地下迷宫探索 (30 分)(C语
- 下一篇: 恶搞代码【全】