Dynamic Code Evaluation Unsafe Deserialization
大綱
一、執行緒理解
二、Thread類和Runnable介面的實現區別
三、執行緒生命週期
四、執行緒操作中常用方法
執行緒理解
在理解執行緒之前需要知道程序,什麼是程序,什麼又是執行緒。從日常的電腦操作中,開啟一個QQ就表示一個程序,而在QQ中開啟聊天視窗,就表示一個執行緒,一個程序中可以有多個執行緒。
Java中執行緒實現方式有兩種:
1、繼承Thread類
2、實現Runnable介面
範例:繼承Thread類,繼承此類之後需要覆寫父類中的run()方法實現執行緒,啟動執行緒需要呼叫start()方法啟動執行緒。
package cn.txp.thread.demo; public class ThreadDemo01 extends Thread{ @Override public void run() { for(int x = 0 ; x < 5; x ++) { System.out.println(Thread.currentThread().getName() + "x=" + x); } } public static void main(String[] args) { ThreadDemo01 thread01= new ThreadDemo01(); ThreadDemo01 thread02 = new ThreadDemo01(); thread01.start(); thread02.start(); } }
範例:實現Runnable介面,實現Runnable介面,在啟動執行緒的時候依然例項化Thread類,呼叫start方法進行啟動。因為執行緒的執行方法體是run()方法,而run是定義的Runnable介面中,Thread類是Runnable介面的實現類,提供了執行緒相關的操作方法,如設定執行緒名稱,獲取優先順序,暫停執行緒,休眠執行緒,啟動執行緒等操作。所以繼承Runnable介面實現的執行緒,在啟動時,需要例項化Thread類,傳遞一個執行緒進去進行啟動。
package cn.txp.thread.demo; public class ThreadDemo02 implements Runnable{ private String name; public ThreadDemo02(String name) { this.name = name; } @Override public void run() { for(int x = 0 ; x < 5 ; x ++) { System.out.println(this.name + x); } } public static void main(String[] args) { ThreadDemo02 thread01 = new ThreadDemo02("執行緒A"); ThreadDemo02 thread02 = new ThreadDemo02("執行緒B"); new Thread(thread01).start(); new Thread(thread02).start(); } }
Thread類和Runnable實現的區別
Java中類是單繼承的,而介面可以實現多個介面,所以使用Runnable介面可以避免單繼承的實現,而這兩種實現方式除了這一點之外,最重要的是多個執行緒資源的共享。
範例:多個執行緒共享
此時是通過繼承Thread類實現的執行緒,並且例項化了三個執行緒,但是這三個執行緒無法共享,這裡把三個執行緒都單獨執行,各自去都買五張票,理因是這三個執行緒去共享五張票。而不是每一個都是單獨的五張
package cn.txp.thread.demo; public class ThreadDemo03 extends Thread{ private String name; private int ticket; public ThreadDemo03(String name, int ticket) { this.name = name; this.ticket = ticket; } @Override public void run() { for(int i = 0 ; i < 100; i ++) { if(ticket > 0) { System.out.println("執行緒" + name + this.ticket --); } } } public static void main(String[] args) { ThreadDemo03 thread1 = new ThreadDemo03("執行緒A", 5); ThreadDemo03 thread2 = new ThreadDemo03("執行緒B", 5); ThreadDemo03 thread3 = new ThreadDemo03("執行緒C", 5); thread1.start(); thread2.start(); thread3.start(); } }
// 輸出結果
執行緒執行緒A5
執行緒執行緒A4
執行緒執行緒A3
執行緒執行緒A2
執行緒執行緒A1
執行緒執行緒B5
執行緒執行緒B4
執行緒執行緒B3
執行緒執行緒B2
執行緒執行緒B1
執行緒執行緒C5
執行緒執行緒C4
執行緒執行緒C3
執行緒執行緒C2
執行緒執行緒C1
範例:通過實現Runnable介面實現資源共享,,輸出介面可以發現,此時也是例項化了三個執行緒,但是這三個執行緒是去共享這5張票,而不是每一個都是單獨的5張。
package cn.txp.thread.demo; public class ThreadDemo04 implements Runnable{ private String name; private int ticket; // 票 public ThreadDemo04(String name, int ticket) { this.name = name; this.ticket = ticket; } @Override public void run() { for(int i = 0 ; i < 100; i ++) { if(ticket > 0) { System.out.println("執行緒" + name + this.ticket --); } } } public static void main(String[] args) { ThreadDemo04 thread = new ThreadDemo04("執行緒", 5); new Thread(thread).start(); new Thread(thread).start(); new Thread(thread).start(); } }
// 輸出結果
執行緒執行緒4
執行緒執行緒5
執行緒執行緒3
執行緒執行緒1
執行緒執行緒2
執行緒生命週期
執行緒的生命週期一共有五種狀態
1、建立狀態:通過new Thread() 建立一個執行緒就為建立狀態
2、就緒狀態:呼叫start()方法啟動執行緒時,此時還沒有執行執行緒,為就緒狀態
3、執行狀態:當執行緒執行run()方法過程中,就為執行狀態
4、堵塞狀態:嗲用了sleep(),suspend()、wait()方法暫停執行緒執行為堵塞狀態
5、死忙狀態:當run()方法執行完畢,或者呼叫了stop()方法停止執行緒,此時執行緒已經執行完畢,就終止執行緒
執行緒操作中常用方法
方法名稱 | 描述 |
public static Thread currentThread() | 獲取當前正在執行的執行緒 |
public final String getName() | 獲取執行緒名稱 |
public final int getPriority() | 獲取執行緒的優先順序 |
public boolean isInterrupted() | 判斷當前執行緒是否終端,是:true 否:false |
public final boolean isAlive() | 判斷執行緒是否被中斷,是:true 否:false |
public final void join() throws Interrupted Exception | 等待執行緒死忙 |
public final synchronized void join(long milis) throws Interrupted Exception | 等待 milis 毫秒後,執行緒死忙 |
public void run() | 執行執行緒 |
public final void setName(String name) | 設定執行緒名稱 |
public final void setPriority(int newPriority) | 設定執行緒的優先順序 |
public static void sleep(long milis) throws InterruptedException | 執行緒休眠 milis 後在執行 |
public void start() | 啟動執行緒 |
public static void yield() | 將當前正在執行的執行緒暫停,允許其他的執行緒執行 |
public final void setDaemon(boolean on) | 設定執行緒為後臺執行 |
知乎文章: https://www.zhihu.com/people/tan-xu-peng-44
程式設計專業知識:https://www.cnblogs.com/tjava
程式設計開發技術問題解決CSDN:https://blog.csdn.net/qq_37291829