`
wanghongjue
  • 浏览: 2970 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

java线程取消方式

阅读更多
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);
	}

}
分享到:
评论

相关推荐

    java线程线程安全同步线程

    这通常是在两个线程交叉工作的时候发生,所以第一个线程做的工作被另一个线程取消。一个简单的示例就是:每个线程已经拥有了一个对象,同时需要另外一个线程拥有的另外一个对象。可以想像这样的情况:每个线程放下...

    Java毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传.rar

    4. 用户界面:项目提供了一个简单的图形用户界面,用户可以输入下载链接、设置线程数量、开始、暂停和取消下载等操作。 5. 日志记录:项目使用了日志框架(如Log4j)来记录下载过程中的关键信息,便于分析和调试。 ...

    线程超时死掉

    Future接口是Java线程Future模式的实 现,可以来进行异步计算。 Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时 间之后,我就便...

    BlockingQueue队列自定义超时时间取消线程池任务

    定义全局线程池,将用户的请求放入自定义队列中,排队等候线程调用,等待超时则自动取消该任务,实现超时可取消的异步任务

    JAVA并发编程实践-线程的关闭与取消-学习笔记

    java中没有提供任何机制,来安全是强迫线程停止手头的工作,Thread.stop和 Thread.suspend方法存在严重的缺陷,不能使用。程序不应该立即停止,应该采用中断这种协作机制来处理,正确的做法是:先清除当前进程中的...

    并发编程实践,全面介绍基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具、Executor部分等

    详细介绍java并发编程相关知识: 基础知识   并发与并行   Java并发演进历史   Java并发模型   线程模型   存储模型 JVM同步原语 volatile CAS 线程安全 ...  线程的中断与任务的取消   其他

    JAVA游戏编程之二----j2me MIDlet 手机游戏入门开发--扫雷(3)-带线程--仿windows扫雷

    增加绘图,线程,时间等,使得游戏更好玩了,代码400行,比较适合初学者,可读性强,有详尽的代码注释。 数字键1标红旗,不确定,取消标记。方向键,数字键2468,控制光标上下左右移动!

    Java并发编程实战

    第7章 取消与关闭 第8章 线程池的使用 第9章 图形用户界面应用程序 第三部分 活跃性、性能与测试 第10章 避免活跃性危险 第11章 性能与可伸缩性 第12章 并发程序的测试 第四部分 高级主题 第13章 显式锁 第...

    Java 7并发编程实战手册

    全书通过60多个简单而非常有效的实例,帮助读者快速掌握Java 7多线程应用程序的开发技术。学习完本书,你可以将这些开发技术直接应用到自己的应用程序中。 《Java 7并发编程实战手册》适合具有一定Java编程基础的...

    android实现多线程下载文件(支持暂停、取消、断点续传)

    多线程下载文件(支持暂停、取消、断点续传) 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将...

    Java并发编程实践 PDF 高清版

    本书的读者是那些具有一定Java编程经验的程序员、希望了解Java SE 5,6在线程技术上的改进和新特性的程序员,以及Java和并发编程的爱好者。 目录 代码清单 序 第1章 介绍 1.1 并发的(非常)简短历史 1.2 线程的...

    Java并发编程part2

    中文完整版的Java并发编程实践PDF电子书 作者:Brian Gogetz Tim Peierls Joshua Bloch Joseph Bowbeer David Holmes Doug Lea 译者:韩锴 方秒 目录 第1章 介绍 1.1 并发的(非常)简短历史 1.2 线程的优点 1.3 ...

    java版IPMSG 含源码(在JAR包里)

    已经试过了多种方法,包括1-增加消息处理线程,UDP接收线程接收消息后写入消息队列,处理线程从队列取消息处理,以提高消息接收速度.2-将UDP接收与UDP发送分开,建两个SOCKET一个用于接收数据,一个用于发送数据,3-建立两...

    Java并发编程(学习笔记).xmind

    事件处理器与访问共享状态的其他代码都要采取线程安全的方式实现 框架通过在框架线程中调用应用程序代码将并发性引入应用程序,因此对线程安全的需求在整个应用程序中都需要考虑 基础知识 线程安全性 ...

    正确结束Java线程的方法

    线程的启动很简单,但用户可能随时取消任务,怎么样让跑起来的线程正确地结束,这是今天要讨论的话题。下面小编来和大家一起学习一下吧

    Java并发编程实践part1

    中文完整版的Java并发编程实践PDF电子书 作者:Brian Gogetz Tim Peierls Joshua Bloch Joseph Bowbeer David Holmes Doug Lea 译者:韩锴 方秒 目录 第1章 介绍 1.1 并发的(非常)简短历史 1.2 线程的优点 1.3 ...

    JAVA并发编程实践_中文版(1-16章全)_1/4

    真正的Addison-Wesley 出品的Java Concurrency in Practice 中文版 目录回到顶部↑ 代码清单 序 第1章 介绍 1.1 并发的(非常)简短历史 1.2 线程的优点 1.3 线程的风险 1.4 线程无处不在 第1部分 基础 第2章 线程...

    Java 并发编程实战

    第7章 取消与关闭 第8章 线程池的使用 第9章 图形用户界面应用程序 第三部分 活跃性、性能与测试 第10章 避免活跃性危险 第11章 性能与可伸缩性 第12章 并发程序的测试 第四部分 高级主题 第13章 显式锁 第...

    Java并发编程实战2019.zip

    Java并发编程实战,第1章 简介,第2章 线程安全性 第3章 对象的共享 第4章 对象的组合 第5章 基础构建模块 第6章 任务执行 第7章 取消与关闭 第8章 线程池的使用 第9章 图形用户界面应用程序 第10章 避免...

Global site tag (gtag.js) - Google Analytics