(十三)java併發程式設計--執行緒中斷
阿新 • • 發佈:2018-12-24
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方法被呼叫。
如果沒有之前的條件舉行這個執行緒的中斷狀態將被設定。