Quantcast
Channel: IT社区推荐资讯 - ITIndex.net
Viewing all articles
Browse latest Browse all 15843

java线程取消方式

$
0
0
JAVA任务取消方式一般有2种
第一种设置某个取消标志,任务定期查看该标志,这种方式存在任务取消并不能保证任务立即取消,更糟糕的是有可能任务永远不会结束
第二种是利用的中断机制,JVM并不能保证阻塞方法检测到中断的速度,但是实际中还是非常快的。
实例一(使用取消标志,会发现取消的任务还执行中,只有执行完再次检测标志任务才取消)

任务不断获取下一个素数,在每次获取素数利用sleep 保证获取素数时间大约10s
package org.thread;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

public class PrimeGenerator extends Thread {

	private final List<BigInteger> primes=new ArrayList<BigInteger>();
	private volatile boolean cancelled;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		BigInteger p=BigInteger.ONE;
		while(!cancelled){
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			p=p.nextProbablePrime();
			synchronized (this) {
				primes.add(p);
			}
		}
	}
	public void cancell(){cancelled=true;};
	public synchronized List<BigInteger> get(){
		return new ArrayList<BigInteger>(primes);
	}

}

测试程序中在启动获取素数的线程后,1s后取消获取素数线程,结果可以看出,线程真正结束是在9s后,结论利用取消标志不能保证线程立即结束或结束。
package org.thread;

public class InterruptTest {

	public static void main(String[] args) {
		PrimeGenerator t=new PrimeGenerator();
//		PrimeGenerator1 t=new PrimeGenerator1();
		t.start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		t.cancell();
		long start=System.currentTimeMillis();
		long end=0;
		while(t.isAlive()){
			 end=System.currentTimeMillis();
		}
		System.out.println(end-start);
	}

}

实例 二(使用中断取消,会发现取消的任务很快就结束)

任务不断获取下一个素数,在每次获取素数利用sleep 保证获取素数时间大约10s
package org.thread;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

public class PrimeGenerator1 extends Thread{

	private final List<BigInteger> primes=new ArrayList<BigInteger>();
	@Override
	public void run() {
		// TODO Auto-generated method stub
		BigInteger p=BigInteger.ONE;
		while(!Thread.currentThread().isInterrupted()){
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				Thread.currentThread().interrupt();
				e.printStackTrace();
			}
			p=p.nextProbablePrime();
			synchronized (this) {
				primes.add(p);
			}
		}
	}
	public void cancell(){interrupt();};
	public synchronized List<BigInteger> get(){
		return new ArrayList<BigInteger>(primes);
	}

}

测试程序中在启动获取素数的线程后,1s后取消获取素数线程,结果可以看出,线程可以立即结束。
package org.thread;

public class InterruptTest {

	public static void main(String[] args) {
//		PrimeGenerator t=new PrimeGenerator();
		PrimeGenerator1 t=new PrimeGenerator1();
		t.start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		t.cancell();
		long start=System.currentTimeMillis();
		long end=0;
		while(t.isAlive()){
			 end=System.currentTimeMillis();
		}
		System.out.println(end-start);
	}

}


已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐




Viewing all articles
Browse latest Browse all 15843

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>