程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java多線程之線程中斷機制

java多線程之線程中斷機制

編輯:關於JAVA
 

看下面的代碼,這個程序大概運行一秒鐘後就會中斷,使用volatile類型的變量來保存取消狀態
package com.thred;

public class InterruptTest {
public static void main(String[] args) {
Worker2 worker = new Worker2();
worker.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

worker.shutdown();
}

}

class Worker2 extends Thread {
volatile boolean flag = true;

@Override
public void run() {
while (flag) {
System.out.println("work");
}
}

public void shutdown() {
flag = false;
}
}


接著再看下面的代碼:

package com.thred;

public class InterruptTest {
public static void main(String[] args) {
Worker2 worker = new Worker2();
worker.start();

try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
worker.shutdown();
}

}

class Worker2 extends Thread {
volatile boolean flag = true;

@Override
public void run() {

while (flag) {

System.out.println("work");
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public void shutdown() {
flag = false;
}
}

用上面那種方式調用shutdown方法來取消線程已經不起效了,因為在線程中調用阻塞方法sleep,這個線程會一直運行下去直到休眠結束。這時我們就得利用線程的中斷機制來取消線程,Thread中的中斷方法:
public class Thread{
public void interrupt(){...}
public boolean isInterrupted(){...}
public static boolean interrupted(){...}
}

阻塞庫方法,例如Thread.sleep和Object.wait等,都會檢查線程何時中斷,並且在發現中斷時返回。它們在相應中斷時執行的操作包括:清除中斷狀態,拋出InterruptException,表示由於阻塞操作提前結束。jvm不能保證阻塞方法檢測到中斷的速度,這要取決於你本機的jvm,實際情況響應速度還是挺快的。接下來我們把代碼改成如下:調用shutdonw方法線程會立即中斷並拋出InterruptException,我們可以在異常中重置取消變量為false來取消線程運行.
package com.thred;

public class InterruptTest {
public static void main(String[] args) {
Worker2 worker = new Worker2();
worker.start();

try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
worker.shutdown();
}

}

class Worker2 extends Thread {
volatile boolean flag = true;

@Override
public void run() {

while (flag) {

System.out.println("work");
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
flag = false;//重置取消狀態
}
}
}

public void shutdown() {
this.interrupt();
}
}
 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved