java语言没有提供一种安全的抢占式方法来停止线程,只有一些协作式的机制,使请求取消的线程和代码都能遵循一种商量好的协议。
“Cancellation Requested(已请求取消)”标志是一种简单的协作机制,线程运行时将检查该标志,如果该标记被置为取消,那么线程将提前结束,否则线程继续运行。
示例:以下示例中线程的目标是找素数集合,没有停止条件,外部程序可以通过cancel方法来停止该线程。
package pku.edu.cn; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; public class TheadCancell1 { class PrimeGenerator implements Runnable { private final List<BigInteger> primes = new ArrayList<BigInteger>(); private volatile boolean canceled; public void run() { BigInteger p = BigInteger.ONE; while(!canceled) { //nextPrime method find the next prime integer p = p.nextPrime(); synchronized(this) { primes.add(p); } } } //外部程序调用cancle方法来终止该线程 public void cancel(){this.canceled = true;} public synchronized List<BigInteger> getPrimes() { return primes; } } /** * @param args */ public static void main(String[] args) { TheadCancell1 Tester = new TheadCancell1(); PrimeGenerator primeGenerator = Tester.new PrimeGenerator(); new Thread(primeGenerator).start(); try { Thread.sleep(1); } catch(Exception e) { e.printStackTrace(); } finally { primeGenerator.cancel(); } System.out.println(primeGenerator.getPrimes()); } }