摘要:大家好,我是樂字節的小樂,好看好學的干貨又來了上一篇我們說到了多線程的概念以及優缺點,本文將接著說多線程的創建,以及多線程的狀態。
大家好,我是樂字節的小樂,好看好學的Java干貨又來了!上一篇我們說到了Java多線程的概念以及優缺點,本文將接著說Java多線程的創建,以及多線程的狀態。
一、創建線程 1、創建 Thread 的子類創建: 繼承 Thread +重寫 run
啟動: 創建子類對象 對象.start()
創建 Thread 子類的一個實例并重寫 run 方法,run 方法會在調用 start()方法之后被執行,示例如下:
public class MyThread extends Thread { public void run(){ for(int i=0;i<10;i++){ try { Thread.sleep(20); //模擬延時 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一邊學習多線程"); } } public static void main(String[] args) { //創建子類對象 MyThread myThread = new MyThread(); //啟動線程 myThread.start(); //也可以創建匿名子類 Thread thread = new Thread(){ public void run(){ for(int i=0;i<10;i++){ try { Thread.sleep(20);//模擬延時 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一邊玩QQ"); } } }; thread.start(); for(int i=0;i<10;i++){ try { Thread.sleep(20); //模擬延時 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一邊玩微信..."); } } }2、實現 Runnable 接口(推薦)
面向接口編程,避免單繼承局限
創建: 實現 Runnable +重寫 run
啟動:靜態代理 Thread
a)、創建真實角色 實現類對象
b)、創建代理角色 Thread 對象+真實角色的引用
c)、代理角色.start()
此方式是新建一個實現了 java.lang.Runnable 接口的類的實例,實例中的方法可以被
線程調用。
缺點: 根據重寫規則,run 方法不能對外聲明異常,不能有返回值
public class MyRunnable implements Runnable { public void run(){ for(int i=0;i<10;i++){ try { Thread.sleep(20); //模擬延時 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一邊學習多線程"); } } public static void main(String[] args) { //使用代理創建線程 Thread thread = new Thread(new MyRunnable()); //啟動線程 thread.start(); //也可以創建一個實現了Runnable接口的匿名類 Runnable myRunnable = new Runnable(){ public void run(){ for(int i=0;i<10;i++){ try { Thread.sleep(20);//模擬延時 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一邊玩QQ"); } } }; Thread t = new Thread(myRunnable); t.start(); for(int i=0;i<10;i++){ try { Thread.sleep(20); //模擬延時 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一邊玩微信..."); } } }
優點: 能聲明異常,能有返回值 缺點: 編寫復雜麻煩
public class Call { public static void main(String[] args) throws InterruptedException, ExecutionException { //創建線程 ExecutorService ser=Executors.newFixedThreadPool(2); Race tortoise = new Race("老不死",1000); Race rabbit = new Race("小兔子",500); //獲取值 Future二、線程的狀態及信息 1、五種狀態result1 =ser.submit(tortoise) ; Future result2 =ser.submit(rabbit) ; Thread.sleep(2000); //2秒 tortoise.setFlag(false); //停止線程體循環 rabbit.setFlag(false); int num1 =result1.get(); int num2 =result2.get(); System.out.println("烏龜跑了-->"+num1+"步"); System.out.println("小兔子跑了-->"+num2+"步"); //停止服務 ser.shutdownNow(); } } class Race implements Callable { private String name ; //名稱 private long time; //延時時間 private boolean flag =true; private int step =0; //步 public Race() { } public Race(String name) { super(); this.name = name; } public Race(String name,long time) { super(); this.name = name; this.time =time; } @Override public Integer call() throws Exception { while(flag){ Thread.sleep(time); //延時 step++; } return step; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getTime() { return time; } public void setTime(long time) { this.time = time; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public int getStep() { return step; } public void setStep(int step) { this.step = step; } }
1)、新生狀態: new
2)、就緒狀態: runnable
3)、運行狀態: running
4)、阻塞狀態: blocked
5)、執行完畢: dead
類似于運動員賽跑,
1)、新生狀態:選出運動員
2)、就緒狀態:走到起跑線,做好跑的動作,槍響后,不是馬上就跑,得有反應時間。
3)、運行狀態:反應完成后,開始跑
4)、阻塞狀態:路邊一個石頭絆倒了,馬上跑起來,嘟囔幾句,踢踢石頭, 不是馬上跑,重新反應進入就 緒。
5)、終止狀態:跑完了,結束了,慢慢的走幾步停下來。
模擬網絡延時,每個對象 都有一把排他鎖,不會釋放鎖
class Web12306 implements Runnable { private int tickets =20; //假設20張票 private boolean flag =true; @Override public void run() { while(flag){ if(tickets>=0){ try { //模擬延時 Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"-->搶票"+tickets--); }else{ flag =false; } } } public static void main(String[] args) { //真實角色 目標 Runnable target =new Web12306(); //代理角色 Thread +真實角色的引用 Thread proxy1 =new Thread(target,"黃牛A"); Thread proxy2 =new Thread(target,"路人甲"); //代理行為 proxy1.start(); //啟動線程 proxy2.start(); //線程不安全,數據有問題 } }3、終止
不要調用 stop destory 方法 ,太暴力,一盆冷水讓其停止。
a、正常執行完畢,循環 次數已經到達
b、外部干涉
1)、線程中加入標識 -->屬性
2)、線程體中 使用改標識 -->死循環
3)、對外提供改變改標識的方法 setXxx() terminate() a()...
4)、外部根據適當的時機調用該方法
Thread.currentThread()
5、優先級只代表概率,不代表絕對先后順序
MIN_PRIORITY : 1
NORM_PRIORITY :5 默認優先級
MAX_PRIORITY :10
getPriority() setPriority()
關于多線程的創建和狀態就介紹到這里,下次我們再說多線程的同步和線程通信,請關注樂字節,原創文章,轉載請注明出處。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75975.html
摘要:注意很多多線程是模擬出來的,真正的多線程是指有多個,即多核如服務器。對于目前的大家來說,線程掌握以下即可創建線程的方式停止線程簡單的關于多線程的概念和優缺點就介紹到這,下一篇將會講講如何創建多線程。 大家好,樂字節小樂有來咯,上次說完了Java網絡編程探究|樂字節,這次我們來看看線程相關的吧。 Java線程主要講述的內容有:showImg(https://segmentfault.co...
摘要:換句話說,套接字起到通信端點的作用。單個套接字是一個端點,而一對套接字則構成一個雙向通信信道,使非關聯進程可以在本地或通過網絡進行數據交換。 大家好,我是樂字節小樂,上次給大家講述了Java中的IO流之輸出流|樂字節,本文將會給大家講述網絡編程。 主要內容如下: 網絡 網絡分層 列表項目 IP位置 端口port 網絡編程 showImg(https://segmentfault.c...
摘要:上次是說到了多線程的創建和狀態樂字節,接下來,我們再來接著說多線程同步和線程通信生產者消費者模式。另一方面,線程通信使線程能夠等待其他線程的信號。 大家伙周末愉快,小樂又來給大家獻上技術大餐。上次是說到了Java多線程的創建和狀態|樂字節,接下來,我們再來接著說Java多線程-同步:synchronized 和線程通信:生產者消費者模式。 一、同步:synchronized 多個線程同...
摘要:一反射機制概念程序運行時,允許改變程序結構或變量類型,這種語言稱為動態語言,如,是動態語言顯然,,不是動態語言,但是有著一個非常突出的動態相關機制。相關的為二獲取源頭重點打開權限所有類的對象其實都是的實例。 一、Java反射機制概念 程序運行時,允許改變程序結構或變量類型,這種語言稱為動態語言,如Python, Ruby是動態語言;顯然C++,Java,C#不是動態語言,但是JAVA有...
摘要:上一篇文章,小樂給大家帶來了新特性之,接下來本文將會給大家介紹新特性之前言通過發布新的來進一步加強對日期與時間的處理。 上一篇文章,小樂給大家帶來了Java8新特性之Optional,接下來本文將會給大家介紹Java8新特性之Date API 前言: Java 8通過發布新的Date-Time API來進一步加強對日期與時間的處理。 舊版的 Java 中,日期時間 API 存在諸多問題...
閱讀 1127·2023-04-26 03:02
閱讀 1169·2023-04-25 19:18
閱讀 2589·2021-11-23 09:51
閱讀 2570·2021-11-11 16:55
閱讀 2620·2021-10-21 09:39
閱讀 1699·2021-10-09 09:59
閱讀 1997·2021-09-26 09:55
閱讀 3523·2021-09-26 09:55