现在的位置: 首页 > 综合 > 正文

java线程停止【一】

2013年12月20日 ⁄ 综合 ⁄ 共 1040字 ⁄ 字号 评论关闭

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());
	}

}

抱歉!评论已关闭.