當(dāng)前位置:
首頁(yè) >
多线程1
發(fā)布時(shí)間:2023/11/29
36
豆豆
1-1 進(jìn)程
程序是靜止的,運(yùn)行中的程序就是進(jìn)程。
- 進(jìn)程的三個(gè)特征:
- 動(dòng)態(tài)性 : 進(jìn)程是運(yùn)行中的程序,要?jiǎng)討B(tài)的占用內(nèi)存,CPU和網(wǎng)絡(luò)等資源。
- 獨(dú)立性 : 進(jìn)程與進(jìn)程之間是相關(guān)獨(dú)立的,彼此有自己的獨(dú)立內(nèi)存區(qū)域。
- 并發(fā)性 : 假如CPU是單核,同一個(gè)時(shí)刻其實(shí)內(nèi)存中只有一個(gè)進(jìn)程在被執(zhí)行。 CPU會(huì)分時(shí)輪詢(xún)切換依次為每個(gè)進(jìn)程服務(wù),因?yàn)榍袚Q的速度非快,給我們的感覺(jué)這些進(jìn)程在==同時(shí)執(zhí)行,這就是并發(fā)性。==
- 并行:同一個(gè)時(shí)刻同時(shí)在執(zhí)行。
1-2 線(xiàn)程
- 線(xiàn)程是屬于進(jìn)程的。==一個(gè)進(jìn)程可以包含多個(gè)線(xiàn)程,這就是多線(xiàn)程==。線(xiàn)程創(chuàng)建開(kāi)銷(xiāo)相對(duì)于進(jìn)程來(lái)說(shuō)比較小。 線(xiàn)程也支持并發(fā)性。
- 線(xiàn)程的作用: 可以提高程序的效率,可以有更多機(jī)會(huì)得到CPU。
1-3 進(jìn)程和線(xiàn)程的總結(jié)
進(jìn)程是運(yùn)行中的程序。有動(dòng)態(tài)性,獨(dú)立性,并發(fā)性。一個(gè)進(jìn)程可以包含多個(gè)線(xiàn)程,線(xiàn)程也支持并發(fā)。
多線(xiàn)程可以提高程序的整體效率,可以解決很多業(yè)務(wù)需求。因?yàn)槎鄠€(gè)線(xiàn)程是并發(fā)搶占CPU執(zhí)行,所以多線(xiàn)程的執(zhí)行會(huì)出現(xiàn)隨機(jī)性。
2-創(chuàng)建線(xiàn)程的三種方式
方式1:定義一個(gè)線(xiàn)程類(lèi)繼承Thread類(lèi),然后重寫(xiě)run()方法,再創(chuàng)建線(xiàn)程對(duì)象,調(diào)用start()方法啟動(dòng)線(xiàn)程
/** 方式一的步驟:a.定義一個(gè)線(xiàn)程類(lèi)繼承Thread類(lèi)b.重寫(xiě)Thread類(lèi)的run()方法c.創(chuàng)建一個(gè)子線(xiàn)程對(duì)象d.調(diào)用線(xiàn)程對(duì)象的start()方法啟動(dòng)線(xiàn)程(其實(shí)最終就是執(zhí)行線(xiàn)程對(duì)象的run()方法)線(xiàn)程的注意:1.啟動(dòng)線(xiàn)程不能直接調(diào)用run()方法,否則是普通對(duì)象的普通方法調(diào)用了,將失去線(xiàn)程特征。線(xiàn)程的啟動(dòng)必須調(diào)用start()2.一般是先創(chuàng)建子線(xiàn)程,再申明主線(xiàn)程的任務(wù),否則主線(xiàn)程任務(wù)總是先執(zhí)行完!優(yōu)缺點(diǎn):優(yōu)點(diǎn):編碼簡(jiǎn)單。缺點(diǎn):線(xiàn)程類(lèi)已經(jīng)繼承了Thread類(lèi),不能再繼承其他類(lèi),功能被削弱了。不能做線(xiàn)程池。無(wú)法直接返回線(xiàn)程執(zhí)行的結(jié)果。*/ public class ThreadDemo {// 自帶一個(gè)線(xiàn)程:main方法本身就是一個(gè)線(xiàn)程,是最牛逼的線(xiàn)程!public static void main(String[] args) {// c.創(chuàng)建一個(gè)子線(xiàn)程對(duì)象MyThread t = new MyThread();// d.啟動(dòng)線(xiàn)程// 注意:啟動(dòng)線(xiàn)程不能直接調(diào)用run()方法,否則是普通對(duì)象的普通方法調(diào)用了,將失去線(xiàn)程特征。// 線(xiàn)程的啟動(dòng)必須調(diào)用start()t.start();for(int i = 0 ; i < 10; i++){System.out.println("main線(xiàn)程執(zhí)行:"+i);}} }// 線(xiàn)程類(lèi)不是線(xiàn)程對(duì)象,是用來(lái)創(chuàng)建線(xiàn)程對(duì)象的。 // a.定義一個(gè)線(xiàn)程類(lèi)繼承Thread類(lèi) class MyThread extends Thread{// b.重寫(xiě)Thread類(lèi)的run()方法@Overridepublic void run() {for(int i = 0 ; i < 10; i++){System.out.println("子線(xiàn)程執(zhí)行:"+i);}} }方式2:定義一個(gè)線(xiàn)程任務(wù)類(lèi)實(shí)現(xiàn)Runnable接口,然后重寫(xiě)run()方法。創(chuàng)建線(xiàn)程任務(wù)對(duì)象,把線(xiàn)程任務(wù)對(duì)象包裝成線(xiàn)程對(duì)象,調(diào)用start()方法啟動(dòng)線(xiàn)程
/** a.定義一個(gè)線(xiàn)程任務(wù)類(lèi)實(shí)現(xiàn)Runnable接口。重寫(xiě)run()方法 b.創(chuàng)建一個(gè)線(xiàn)程任務(wù)對(duì)象 c.把線(xiàn)程任務(wù)對(duì)象包裝成一個(gè)線(xiàn)程對(duì)象-- public Thread(Runnable target) d.調(diào)用線(xiàn)程對(duì)象的start()方法啟動(dòng)線(xiàn)程。優(yōu)缺點(diǎn):缺點(diǎn):編程相對(duì)復(fù)雜,不能直接返回線(xiàn)程的執(zhí)行結(jié)果優(yōu)點(diǎn):1. 一個(gè)任務(wù)對(duì)象可以被反復(fù)包裝成多個(gè)線(xiàn)程對(duì)象。2. 可以避免java中的單繼承的局限性。因?yàn)榫€(xiàn)程任務(wù)對(duì)象只是實(shí)現(xiàn)了接口,還可以繼續(xù)繼承其他類(lèi)和實(shí)現(xiàn)其他接口。3. 實(shí)現(xiàn)解耦操作,線(xiàn)程任務(wù)對(duì)象代碼可以被多個(gè)線(xiàn)程共享,代碼和線(xiàn)程獨(dú)立。4. 線(xiàn)程池只能放入實(shí)現(xiàn)Runable或Callable類(lèi)線(xiàn)程,不能直接放入繼承Thread的類(lèi)。適合做線(xiàn)程池。*/ public class ThreadDemo {public static void main(String[] args) {// b.創(chuàng)建一個(gè)線(xiàn)程任務(wù)對(duì)象Runnable target = new MyRunnable();// c.把線(xiàn)程任務(wù)對(duì)象包裝成線(xiàn)程對(duì)象Thread t = new Thread(target);// d.調(diào)用線(xiàn)程對(duì)象的start()方法啟動(dòng)線(xiàn)程。t.start();Thread t1 = new Thread(target);t1.start();for(int i = 0 ; i < 10; i++){System.out.println(Thread.currentThread().getName()+"=>"+i);}}} // 線(xiàn)程任務(wù)類(lèi) // a.定義一個(gè)線(xiàn)程任務(wù)類(lèi)實(shí)現(xiàn)Runnable接口。 class MyRunnable implements Runnable{@Overridepublic void run() {for(int i = 0 ; i < 10; i++){System.out.println(Thread.currentThread().getName()+"=>"+i);}} }方式三:定義一個(gè)線(xiàn)程任務(wù)類(lèi)實(shí)現(xiàn)Callable接口
/** a.定義一個(gè)線(xiàn)程任務(wù)類(lèi)實(shí)現(xiàn)Callable接口。 b.重寫(xiě)call()方法。 c.把線(xiàn)程任務(wù)對(duì)象包裝成一個(gè)未來(lái)任務(wù)對(duì)象。 d.把未來(lái)任務(wù)對(duì)象包裝成一個(gè)線(xiàn)程對(duì)象。 e.調(diào)用線(xiàn)程對(duì)象的start()方法啟動(dòng)線(xiàn)程。 優(yōu)缺點(diǎn):缺點(diǎn):編碼復(fù)雜。優(yōu)點(diǎn):全是優(yōu)點(diǎn)。可以繼續(xù)繼承其他類(lèi)。可以做線(xiàn)程池。可以得到線(xiàn)程返回的結(jié)果。可以做資源共享操作*/ public class ThreadDemo {public static void main(String[] args) {MyCallable call = new MyCallable();// c.把線(xiàn)程任務(wù)對(duì)象包裝成一個(gè)未來(lái)任務(wù)對(duì)象。/*** 未來(lái)任務(wù)對(duì)象: FutureTask* 1.可以通過(guò)未來(lái)任務(wù)對(duì)象去獲取線(xiàn)程執(zhí)行的結(jié)果。* 2.未來(lái)任務(wù)對(duì)象其實(shí)就是一個(gè)Runnable的對(duì)象。*/FutureTask<String> target = new FutureTask<>(call);// d.把未來(lái)任務(wù)對(duì)象包裝成一個(gè)線(xiàn)程對(duì)象。Thread t = new Thread(target);// e.調(diào)用線(xiàn)程對(duì)象的start()方法啟動(dòng)線(xiàn)程。t.start();for(int i = 0 ; i < 10; i++){System.out.println(Thread.currentThread().getName()+"=>"+i);}try {// 線(xiàn)程的執(zhí)行的結(jié)果!String result = target.get();System.out.println(result);} catch (Exception e) {e.printStackTrace();}} } // a.定義一個(gè)線(xiàn)程任務(wù)類(lèi)實(shí)現(xiàn)Callable接口。申明返回值類(lèi)型 class MyCallable implements Callable<String>{// b.重寫(xiě)call()方法。@Overridepublic String call() throws Exception {int count = 0 ;for(int i = 0 ; i < 10; i++){count+=(i+1) ; // 1-10的和。System.out.println(Thread.currentThread().getName()+"=>"+i);}return Thread.currentThread().getName()+"求和結(jié)果:"+count;} }轉(zhuǎn)載于:https://www.cnblogs.com/Guard9/p/11152841.html
總結(jié)
- 上一篇: 梦到被男人骂什么预兆
- 下一篇: 矩阵的理解经典博客