1. 程式人生 > 實用技巧 >Dynamic Code Evaluation Unsafe Deserialization

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