1. 程式人生 > >(十三)java併發程式設計--執行緒中斷

(十三)java併發程式設計--執行緒中斷

1、自己新增執行緒退出標誌位。

如下程式碼所示:

package thread_priority;

/**
 * Created by fang on 2017/12/3.
 *
 */
public class MyThread implements Runnable {
    private boolean flag = true;

    private int num = 0;
    public void run(){
        while (flag){
            System.out.println(Thread.currentThread().getName() + "-->"
+ num++); } } public void stop(){ this.flag = !this.flag; } }

呼叫自己定義的stop方法.

package thread_priority;

/**
 * Created by fang on 2017/12/3.
 * 執行緒優先順序.
 * MAX_PRIORITY 10
 * NORM_PRIORITY 5
 * MIN_PRIORITY 1
 * setPriority()方法是設定優先順序.getPriority()是獲取優先順序.
 * 不是絕對的優先順序,是概率,優先順序高概率高,但不代表絕對的先後順序.
 */
public class ThreadMain2 { public static void main(String[] args) throws InterruptedException { //兩個執行緒沒有任何的優先順序. MyThread myThread = new MyThread(); Thread proxy = new Thread(myThread,"挨踢1"); MyThread myThread2 = new MyThread(); Thread proxy2 = new Thread(myThread2,"挨踢2"
); //設定優先順序 //會看到proxy2 執行的多,但是並不代表先後順序,proxy也有執行在前面的. proxy.setPriority(Thread.MIN_PRIORITY); proxy2.setPriority(Thread.MAX_PRIORITY); proxy.start(); proxy2.start(); Thread.sleep(100); myThread.stop(); myThread2.stop(); } }

2、呼叫Thread stop()方法停止執行緒。

java8api文章中顯示,該方法已經被廢棄。
因為thread.stop()方法本身是不安全的。
如api文件
這裡寫圖片描述

3、使用interrupt方法中斷執行緒。

package thread_interrupt;

/**
 * Created by fang on 2017/12/7.
 */
public class MyThread extends Thread{
    public void run(){
        System.out.println("我是執行緒體....");
    }

}

thread interrupt 終止執行緒。

package thread_interrupt;

/**
 * Created by fang on 2017/12/7.
 * interrupt執行緒終止.
 */
public class ThreadInterruptDemo {
    public static void main(String[] args) throws InterruptedException {
        MyThread myThread  = new MyThread();
        myThread.start();
        System.out.println("Starting thread...");
        Thread.sleep(3000);
        myThread.interrupt();//阻塞時推出阻塞狀態.
        Thread.sleep(3000);//休眠3s觀察myThread阻塞狀態.
        System.out.println("stop application.......");
    }
}

interrupt為thread的一個方法,檢視幫助文件:
interrupt public void interrupt()
幫助文件內容如下:
除非中斷當前執行緒本身總是允許,這個執行緒的checkAccess方法被呼叫時,這可能會導致一個SecurityException丟擲。

如果這個執行緒被阻塞的呼叫wait(),wait(long),或wait(long, int) Object類的方法,或join(),join(long),join(long, int),sleep(long),或sleep(long, int),這個類的方法,那麼它的中斷狀態將被清除,它將接收一個InterruptedException。

如果這個執行緒被阻塞的I / O操作在一個InterruptibleChannel通道將被關閉,執行緒的中斷狀態將被設定,執行緒會收到ClosedByInterruptException

如果這個執行緒被阻塞在Selector那麼執行緒的中斷狀態將從選擇操作,它會立即返回,可能與一個非零值,就像選擇器的wakeup方法被呼叫。

如果沒有之前的條件舉行這個執行緒的中斷狀態將被設定。