摘要:多線程術(shù)語辨析任務(wù)和線程是不同的中類本身不執(zhí)行任何操作它只驅(qū)動(dòng)賦予它的任務(wù)而才是定義任務(wù)的地方創(chuàng)建任務(wù)的方式有兩種實(shí)現(xiàn)接口中的方法查看源碼可以看到只有一個(gè)方法使用直接繼承即可這樣就創(chuàng)建了一個(gè)任務(wù)暗示調(diào)度器該線程可以讓出資源了中實(shí)現(xiàn)方法部分源
java多線程 1. 術(shù)語辨析
任務(wù)和線程是不同的,Java中Thread類本身不執(zhí)行任何操作,它只驅(qū)動(dòng)賦予它的任務(wù),而Runnable才是定義任務(wù)的地方.
2. 創(chuàng)建任務(wù)的方式有兩種 2.1 實(shí)現(xiàn)Runnable接口中的run方法1.查看Runnable源碼,可以看到只有一個(gè)run()方法
@FunctionalInterface public interface Runnable { /** * When an object implementing interfaceRunnable
is used * to create a thread, starting the thread causes the object"s *run
method to be called in that separately executing * thread. ** The general contract of the method
run
is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); }
2.使用Runnable,直接繼承即可,這樣就創(chuàng)建了一個(gè)任務(wù).
public class MyRunnable implements Runnable{ @Override public void run() { int i=0; while(true) System.out.println(i++); } //暗示調(diào)度器該線程可以讓出資源了 Thread.yield(); }2.2 Thread中實(shí)現(xiàn)run方法
1.Thread部分源碼
/* * @see Runnable * @see Runtime#exit(int) * @see #run() * @see #stop() * @since JDK1.0 */ public class Thread implements Runnable { /* Make sure registerNatives is the first thingdoes. */ private static native void registerNatives(); static { registerNatives(); }
2.可以看到Thread繼承了Runnable接口,所以Thread創(chuàng)建任務(wù)也是用的run方法
3.代碼可以這樣寫
class MyThread extends Thread{ @Override public void run() { int count=10; while(count--!=0) System.out.print(count+" "); } }3. 運(yùn)行任務(wù)
1.不要誤會(huì),下面的方法并未啟動(dòng)一個(gè)線程,而是單純的調(diào)用了實(shí)現(xiàn)Runnable接口的MyRunnable的run()方法,所以該任務(wù)的運(yùn)行依舊被分派到該main線程中,不會(huì)獨(dú)立運(yùn)行在一個(gè)新線程里.
public class Main{ public static void main(String[] args){ Runnable runnable=new Runnable(); runnable.run(); } }
2.調(diào)用Thread的start(),Thread中記錄了很多線程信息,包括線程名稱和優(yōu)先級(jí)等,以MyRunnable的實(shí)例作參傳入Thread,然后start即可運(yùn)行.
public static void main(String[] args){ Thread thread=new Thread(new MyRunnable); thread.start() }
3.在調(diào)用start()后,子線程不會(huì)因?yàn)橹骶€程代碼執(zhí)行結(jié)束而停止.
4. 使用執(zhí)行器(Executor)管理Thread.public static void main(String[] args){ //常見執(zhí)行器對(duì)象 ExecutorService executorService= Executors.newCachedThreadPool(); //向執(zhí)行器中添加任務(wù) executorService.execute(new MyRunnable()); //關(guān)閉向執(zhí)行器中添加任務(wù); executorService.shutdown();
創(chuàng)建執(zhí)行器又三種類型可選,分別是newCachedThreadPool,newFixedThreadPool,newSingleThreadPool,區(qū)別如下
newCachedThreadPool:系統(tǒng)自動(dòng)調(diào)配線程池中的線程數(shù)量,并主動(dòng)復(fù)用已完成的線程資源.
newFixedThreadPool:可以自定義線程池中線程數(shù)量;
newSingleThreadPool:單例,線程池中只有一個(gè)線程,加載的任務(wù)會(huì)被排隊(duì),任務(wù)只能一個(gè)個(gè)依次完成.
5.線程的返回值1.有些任務(wù)執(zhí)行完后需要返回值,那么創(chuàng)建任務(wù)時(shí)可以通過實(shí)現(xiàn)Callale接口而實(shí)現(xiàn)該目的,Callable是一種具有類型參數(shù)的泛型,因?yàn)榉祷刂凳切枰x類型的.
class Task implements Callable{ @Override public String call() throws Exception { Thread.currentThread().setPriority(Thread.MAX_PRIORITY); TimeUnit.MILLISECONDS.sleep(100); return "線程執(zhí)行啦"; } }
2.然后在main()方法中接受返回值信息,對(duì)線程信息的管理可以用Future
public static void main(String[] args){ ExecutorService executorService=Executors.newCachedThreadPool(); Futurefuture=executorService.submit(new Callable (){??? @Override??? public String call() throws Exception { return "執(zhí)行啦";??? } }); //判斷是否完成 System.out.println(future.isDone()); //任務(wù)完成后,才會(huì)打印詞條語句,否則會(huì)阻塞. System.out.println(future.get()); //判斷是否完成 System.out.println(future.isDone()); } ----------輸出---------- false 執(zhí)行啦 true
3.程序運(yùn)行到get()方法時(shí)會(huì)阻塞,當(dāng)運(yùn)行完后,主程序才會(huì)繼續(xù)向后執(zhí)行.
6. 程序的優(yōu)先級(jí)1.優(yōu)先級(jí)的設(shè)置在run方法中
public void run(){ //例如將優(yōu)先級(jí)設(shè)置為10 Thread.currentThread().setPriority(10) }
2.為了方便移植,建議將優(yōu)先級(jí)設(shè)置為Thread中的三個(gè)常量.
7. 后臺(tái)線程1.設(shè)置后臺(tái)線程語法 thread.setDaemon(true);要在start()之前.
2.后臺(tái)線程創(chuàng)建的線程也為后臺(tái)線程.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73495.html
摘要:上面需要了解的是這倆個(gè)版本都是破蛹成蝶的版本世界挑戰(zhàn)榜咋才前三還沒擠進(jìn)去呀,你想想世界上有幾千中編程語言,在其中脫穎出來,可以說是天之嬌子,鳳毛麟角了。支持正版圖靈上面買吧,如果沒錢買盜版吧學(xué)完以后買本正版支持一下,創(chuàng)作不易是吧 ...
摘要:系統(tǒng)級(jí)線程核心級(jí)線程由操作系統(tǒng)內(nèi)核進(jìn)行管理。值得注意的是多線程的存在,不是提高程序的執(zhí)行速度。實(shí)現(xiàn)多線程上面說了一大堆基礎(chǔ),理解完的話。虛擬機(jī)的啟動(dòng)是單線程的還是多線程的是多線程的。 前言 之前花了一個(gè)星期回顧了Java集合: Collection總覽 List集合就這么簡單【源碼剖析】 Map集合、散列表、紅黑樹介紹 HashMap就是這么簡單【源碼剖析】 LinkedHashMa...
摘要:大多數(shù)待遇豐厚的開發(fā)職位都要求開發(fā)者精通多線程技術(shù)并且有豐富的程序開發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線程相關(guān)的問題在面試中經(jīng)常會(huì)被提到。將對(duì)象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對(duì)象稱之為反序列化。 JVM 內(nèi)存溢出實(shí)例 - 實(shí)戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細(xì)介紹 Java 注解的使用,有利于學(xué)習(xí)編譯時(shí)注解 Java 程序員快速上手 Kot...
閱讀 952·2021-11-16 11:45
閱讀 2153·2021-10-09 09:44
閱讀 1376·2019-08-30 14:03
閱讀 1163·2019-08-26 18:28
閱讀 3357·2019-08-26 13:50
閱讀 1751·2019-08-23 18:38
閱讀 3478·2019-08-23 18:22
閱讀 3635·2019-08-23 15:27