java线程取消方式

标签: java 线程 | 发表时间:2014-05-17 22:49 | 作者:wanghongjue
出处:http://www.iteye.com
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推荐



相关 [java 线程] 推荐:

Java线程池

- - 企业架构 - ITeye博客
线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的. 在jdk1.5之后这一情况有了很大的改观. Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用. 为我们在开发中处理线程的问题提供了非常大的帮助.

Java 线程池

- - 编程语言 - ITeye博客
在项目中,系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互. 在这种情形下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存周期很短的线程时,更应该考虑使用线程池. 使用线程池可以有效地控制系统中并发线程的数量,当系统中包含大量并发线程时,会导致系统性能剧烈下降,甚至导致JVM崩溃,而线程池的最大线程数参数可以控制系统中并发线程数不超过此数.

Java Thread多线程

- - CSDN博客推荐文章
Java Thread多线程. Java 多线程例子1 小例子. super("zhuyong");//设置线程的名字,默认为“TestThread”. Java 多线程例子2 前台线程(用户线程) 后台线程(守护线程 ). 1,setDaemon(true)后就是后台线程(守护线程 ),反之就是前台线程(用户线程).

Java线程之FutureTask

- - zzm
FutureTask是Future和Callable的结合体. 然后通过Future来取得计算结果. 但是,若开启了多个任务,我们无从知晓哪个任务最先结束,因此,若要实现“当某任务结束时,立刻做一些事情,例如记录日志”这一功能,就需要写一些额外的代码. FutureTask正是为此而存在,他有一个回调函数protected void done(),当任务结束时,该回调函数会被触发.

[Java] Java 多线程案例分析

- - V2EX
现要从 hbase中导出 2016 年整年的,大约 10w只股票行情数据,数据总量约 100t. 汇总到 hdfs中供需求方使用. 已知数据量规模大概是 100t,那么单台机器处理肯定不是不行的,先不说大多数磁盘都没这么大,即便磁盘有这么大,单台机器处理对于内存和 cpu 要求也很高,所以我们将问题一般化,使用数量有限的低配机器.

Java多线程之synchronized

- - CSDN博客推荐文章
这里通过三个测试类阐述了synchronized应用的不同场景. 首先是最基本的synchronized Method的使用.  * @see 概述:Java中的每个对象都有一个锁(lock)或者叫做监视器(monitor) .  * @see 说明:当synchronized关键字修饰一个方法时,则该方法为同步方法 .

java线程池分析

- - BlogJava-首页技术区
    在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制 同时执行的线程数量就需要额外编写代码来完成. 5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务.

java线程取消方式

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

Java线程池应用

- - CSDN博客架构设计推荐文章
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务. 2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机). Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具.

Java线程池总结

- - Java - 编程语言 - ITeye博客
  假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间. 当T1 + T3 远大于 T2时,采用多线程技术可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     线程池就是一个线程的容器,每次只执行额定数量的线程, 线程池作用就是限制系统中执行线程的数量.