摘要:多線程術語辨析任務和線程是不同的中類本身不執行任何操作它只驅動賦予它的任務而才是定義任務的地方創建任務的方式有兩種實現接口中的方法查看源碼可以看到只有一個方法使用直接繼承即可這樣就創建了一個任務暗示調度器該線程可以讓出資源了中實現方法部分源
java多線程 1. 術語辨析
任務和線程是不同的,Java中Thread類本身不執行任何操作,它只驅動賦予它的任務,而Runnable才是定義任務的地方.
2. 創建任務的方式有兩種 2.1 實現Runnable接口中的run方法1.查看Runnable源碼,可以看到只有一個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,直接繼承即可,這樣就創建了一個任務.
public class MyRunnable implements Runnable{ @Override public void run() { int i=0; while(true) System.out.println(i++); } //暗示調度器該線程可以讓出資源了 Thread.yield(); }2.2 Thread中實現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創建任務也是用的run方法
3.代碼可以這樣寫
class MyThread extends Thread{ @Override public void run() { int count=10; while(count--!=0) System.out.print(count+" "); } }3. 運行任務
1.不要誤會,下面的方法并未啟動一個線程,而是單純的調用了實現Runnable接口的MyRunnable的run()方法,所以該任務的運行依舊被分派到該main線程中,不會獨立運行在一個新線程里.
public class Main{ public static void main(String[] args){ Runnable runnable=new Runnable(); runnable.run(); } }
2.調用Thread的start(),Thread中記錄了很多線程信息,包括線程名稱和優先級等,以MyRunnable的實例作參傳入Thread,然后start即可運行.
public static void main(String[] args){ Thread thread=new Thread(new MyRunnable); thread.start() }
3.在調用start()后,子線程不會因為主線程代碼執行結束而停止.
4. 使用執行器(Executor)管理Thread.public static void main(String[] args){ //常見執行器對象 ExecutorService executorService= Executors.newCachedThreadPool(); //向執行器中添加任務 executorService.execute(new MyRunnable()); //關閉向執行器中添加任務; executorService.shutdown();
創建執行器又三種類型可選,分別是newCachedThreadPool,newFixedThreadPool,newSingleThreadPool,區別如下
newCachedThreadPool:系統自動調配線程池中的線程數量,并主動復用已完成的線程資源.
newFixedThreadPool:可以自定義線程池中線程數量;
newSingleThreadPool:單例,線程池中只有一個線程,加載的任務會被排隊,任務只能一個個依次完成.
5.線程的返回值1.有些任務執行完后需要返回值,那么創建任務時可以通過實現Callale接口而實現該目的,Callable是一種具有類型參數的泛型,因為返回值是需要定義類型的.
class Task implements Callable{ @Override public String call() throws Exception { Thread.currentThread().setPriority(Thread.MAX_PRIORITY); TimeUnit.MILLISECONDS.sleep(100); return "線程執行啦"; } }
2.然后在main()方法中接受返回值信息,對線程信息的管理可以用Future
public static void main(String[] args){ ExecutorService executorService=Executors.newCachedThreadPool(); Futurefuture=executorService.submit(new Callable (){??? @Override??? public String call() throws Exception { return "執行啦";??? } }); //判斷是否完成 System.out.println(future.isDone()); //任務完成后,才會打印詞條語句,否則會阻塞. System.out.println(future.get()); //判斷是否完成 System.out.println(future.isDone()); } ----------輸出---------- false 執行啦 true
3.程序運行到get()方法時會阻塞,當運行完后,主程序才會繼續向后執行.
6. 程序的優先級1.優先級的設置在run方法中
public void run(){ //例如將優先級設置為10 Thread.currentThread().setPriority(10) }
2.為了方便移植,建議將優先級設置為Thread中的三個常量.
7. 后臺線程1.設置后臺線程語法 thread.setDaemon(true);要在start()之前.
2.后臺線程創建的線程也為后臺線程.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73495.html
摘要:上面需要了解的是這倆個版本都是破蛹成蝶的版本世界挑戰榜咋才前三還沒擠進去呀,你想想世界上有幾千中編程語言,在其中脫穎出來,可以說是天之嬌子,鳳毛麟角了。支持正版圖靈上面買吧,如果沒錢買盜版吧學完以后買本正版支持一下,創作不易是吧 ...
摘要:系統級線程核心級線程由操作系統內核進行管理。值得注意的是多線程的存在,不是提高程序的執行速度。實現多線程上面說了一大堆基礎,理解完的話。虛擬機的啟動是單線程的還是多線程的是多線程的。 前言 之前花了一個星期回顧了Java集合: Collection總覽 List集合就這么簡單【源碼剖析】 Map集合、散列表、紅黑樹介紹 HashMap就是這么簡單【源碼剖析】 LinkedHashMa...
閱讀 920·2021-11-16 11:45
閱讀 2126·2021-10-09 09:44
閱讀 1340·2019-08-30 14:03
閱讀 1126·2019-08-26 18:28
閱讀 3328·2019-08-26 13:50
閱讀 1715·2019-08-23 18:38
閱讀 3450·2019-08-23 18:22
閱讀 3588·2019-08-23 15:27