多线程的三种实现
1、java多線(xiàn)程增強(qiáng)
java多線(xiàn)程基本知識(shí)
20.1進(jìn)程介紹
???? 不管是我們開(kāi)發(fā)的應(yīng)用程序,還是我們運(yùn)行的其他的應(yīng)用程序,都需要先把程序安裝在本地的硬盤(pán)上。然后找到這個(gè)程序的啟動(dòng)文件,啟動(dòng)程序的時(shí)候,其實(shí)是電腦把當(dāng)前的這個(gè)程序加載到內(nèi)存中,在內(nèi)存中需要給當(dāng)前的程序分配一段獨(dú)立的運(yùn)行空間。這片空間就專(zhuān)門(mén)負(fù)責(zé)當(dāng)前這個(gè)程序的運(yùn)行。
???? 不同的應(yīng)用程序運(yùn)行的過(guò)程中都需要在內(nèi)存中分配自己獨(dú)立的運(yùn)行空間,彼此之間不會(huì)相互的影響。我們把每個(gè)獨(dú)立應(yīng)用程序在內(nèi)存的獨(dú)立空間稱(chēng)為當(dāng)前應(yīng)用程序運(yùn)行的一個(gè)進(jìn)程。
進(jìn)程:它是內(nèi)存中的一段獨(dú)立的空間,可以負(fù)責(zé)當(dāng)前應(yīng)用程序的運(yùn)行。當(dāng)前這個(gè)進(jìn)程負(fù)責(zé)調(diào)度當(dāng)前程序中的所有運(yùn)行細(xì)節(jié)。
20.2線(xiàn)程介紹
???? 啟動(dòng)的QQ聊天軟件,需要和多個(gè)人進(jìn)行聊天。這時(shí)多個(gè)人之間是不能相互影響,但是它們都位于當(dāng)前QQ這個(gè)軟件運(yùn)行時(shí)所分配的內(nèi)容的獨(dú)立空間中。
???? 在一個(gè)進(jìn)程中,每個(gè)獨(dú)立的功能都需要獨(dú)立的去運(yùn)行,這時(shí)又需要把當(dāng)前這個(gè)進(jìn)程劃分成多個(gè)運(yùn)行區(qū)域,每個(gè)獨(dú)立的小區(qū)域(小單元)稱(chēng)為一個(gè)線(xiàn)程。
線(xiàn)程:它是位于進(jìn)程中,負(fù)責(zé)當(dāng)前進(jìn)程中的某個(gè)具備獨(dú)立運(yùn)行資格的空間。
進(jìn)程是負(fù)責(zé)整個(gè)程序的運(yùn)行,而線(xiàn)程是程序中具體的某個(gè)獨(dú)立功能的運(yùn)行。一個(gè)進(jìn)程中至少應(yīng)該有一個(gè)線(xiàn)程。
20.3多線(xiàn)程介紹
???? 現(xiàn)在的操作系統(tǒng)基本都是多用戶(hù),多任務(wù)的操作系統(tǒng)。每個(gè)任務(wù)就是一個(gè)進(jìn)程。而在這個(gè)進(jìn)程中就會(huì)有線(xiàn)程。
???? 真正可以完成程序運(yùn)行和功能的實(shí)現(xiàn)靠的是進(jìn)程中的線(xiàn)程。
多線(xiàn)程:在一個(gè)進(jìn)程中,我們同時(shí)開(kāi)啟多個(gè)線(xiàn)程,讓多個(gè)線(xiàn)程同時(shí)去完成某些任務(wù)(功能)。
多線(xiàn)程的目的:提高程序的運(yùn)行效率。
20.4多線(xiàn)程運(yùn)行的原理
???? cpu在線(xiàn)程中做時(shí)間片的切換。
?
???? 其實(shí)真正電腦中的程序的運(yùn)行不是同時(shí)在運(yùn)行的。CPU負(fù)責(zé)程序的運(yùn)行,而CPU在運(yùn)行程序的過(guò)程中某個(gè)時(shí)刻點(diǎn)上,它其實(shí)只能運(yùn)行一個(gè)程序。而不是多個(gè)程序。而CPU它可以在多個(gè)程序之間進(jìn)行高速的切換。而切換頻率和速度太快,導(dǎo)致人的肉看看不到。
每個(gè)程序就是進(jìn)程, 而每個(gè)進(jìn)程中會(huì)有多個(gè)線(xiàn)程,而CPU是在這些線(xiàn)程之間進(jìn)行切換。
了解了CPU對(duì)一個(gè)任務(wù)的執(zhí)行過(guò)程,我們就必須知道,多線(xiàn)程可以提高程序的運(yùn)行效率,但不能無(wú)限制的開(kāi)線(xiàn)程。
20.5實(shí)現(xiàn)線(xiàn)程的兩種方式
1、繼承Thread的原理
???????? 見(jiàn)代碼MyThreadWithExtends
package thread1; ? import java.util.Random; ? public class MyThreadWithExtends extends Thread { ??? String flag; ??? ??? public MyThreadWithExtends(String flag) { ???????? this.flag = flag; ???? } ??? ??? @Override ??? public void run() { ??? //獲取當(dāng)前線(xiàn)程的線(xiàn)程名 ??? String tname = Thread.currentThread().getName(); ??? System.out.println(tname + "線(xiàn)程的run方法被調(diào)用...."); ??? Random random = new Random(); ??? for (int i = 0; i < 20; i++) { ????????????? try { ?????????????????? Thread.sleep(random.nextInt(10) * 100); ?????????????????? System.out.println(tname + "...."? + flag); ????????????? } catch (Exception e) { ?????????????????? e.printStackTrace(); ????????????? } ???????? } ??? } ??? ??? public static void main(String[] args) { ???????? Thread thread1 = new MyThreadWithExtends("a"); ???????? Thread thread2 = new MyThreadWithExtends("b"); ???????? thread1.start(); ???????? thread2.start(); ???? } } |
?
2、聲明實(shí)現(xiàn) Runnable 接口的類(lèi)
???????? 見(jiàn)代碼MyThreadWithImpliment
package thread1; ? public class MyThreadWithImpliment implements Runnable { ???? int x; ???? ???? public MyThreadWithImpliment(int x) { ???????? this.x = x; ???? } ???? ???? @Override ???? public void run() { ???????? String name = Thread.currentThread().getName(); ???????? System.out.println("線(xiàn)程" + name + "的run方法被調(diào)用...."); ???????? for (int i = 0; i < 10; i++) { ????????????? System.out.println(x); ????????????? try { ?????????????????? Thread.sleep(100); ????????????? } catch (Exception e) { ?????????????????? e.printStackTrace(); ????????????? } ???????? } ???? } ? ???? public static void main(String[] args) { ???????? Thread thread1 = new Thread(new MyThreadWithImpliment(1),"thread-1"); ???????? Thread thread2 = new Thread(new MyThreadWithImpliment(2),"thread-2"); ???????? thread1.start(); ???????? thread2.start(); ???? } } |
?
3、還可以實(shí)現(xiàn)Callable接口
總結(jié)
- 上一篇: 中国发展轰20轰炸机刻不容缓?
- 下一篇: java同步关键词解释、synchron