`
pocketduck
  • 浏览: 19700 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中的线程停止

阅读更多
想象一下这个场景,用户刚刚点了连接数据库后,忽然想起这个数据库没有启动,要等到默认的timeout(比如30秒后),连接才会停止,这时用户想立刻停止连接数据库的动作,怎么处理呢?
public void run(final IProgressMonitor pm) throws InvocationTargetException {
		pm.beginTask(Messages.progressMetadata, IProgressMonitor.UNKNOWN);
		try {
			connector.connectdatabase();
		}catch(Exception e){
			LOG.error(e.getMessage(), e);		
        }finally {
			pm.done();
		}
	}


这是在一个线程里完成该任务,如果connectdatabase();非常慢的话,那么用户只能一直等
更好的做法是,让另外一个线程去处理连接动作,前台页面返回,让用户可以做别的事情,示意代码如下
public void run(final IProgressMonitor pm) throws InvocationTargetException {
		pm.beginTask(Messages.progressMetadata, IProgressMonitor.UNKNOWN);
			Thread thread = new Thread("Cancel progress"){
				public void run() {
					connector.connectdatabase();
				}
			};
		thread.start();
		
		}catch(Exception e){
			LOG.error(e.getMessage(), e);		
        }finally {
			pm.done();
		}
	}


这时用户发现数据库没有启动,想在页面中点一下终止连接按钮停止连接,比如在eclipse的IRunnableWithProgress中,虽然可以监听用户点击按钮,但是这时run 方法的线程和叫做"Cancel progress"的线程已经没有什么关系了,无法通过监听户点击终止按钮而使"Cancel progress"线程停下,这时可以用下面的方法

public void run(final IProgressMonitor pm) throws InvocationTargetException {
		pm.beginTask(Messages.progressMetadata, IProgressMonitor.UNKNOWN);
		try {
			Thread thread = new Thread("Cancel progress"){
				public void run() {
					connector.connectdatabase();
				}
			};
			thread.start();
			
			while (true) {
				if(pm == null){
					break;
				}				
				if(pm.isCanceled()){
                    connector.gc();
					thread.interrupt();				
					return;
				}else{
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						LOG.error(e.getMessage(), e);
					}
				}
				if(connector.isFinish()){
					break;
				}
			}		
		}catch(Exception e){
			LOG.error(e.getMessage(), e);		
        }finally {
			pm.done();
		}
	}

首先在父线程中,启动子线程,一般的正常流程是,父线程一直处于循环中,每次循环去判断子线程是否完成,(当然子线程完成后需要设置一下完成标志位),发现子线程结束后父线程跳出循环,继续执行后面的代码.当用户点击取消按钮后(pm.isCanceled()是IRunnableWithProgress中监听用户点击取消按钮时的动作),并且将子线程处理一下(比如回收一些垃圾等),方法返回,这样就可以达到目的了.另外重要的一点,父线程循环过程中记得sleep一下,给其他线程一些执行机会,节省cpu资源
0
2
分享到:
评论

相关推荐

    JAVA线程停止的方法

    本文将深入探讨Java线程停止的方法,特别是通过一个示例代码片段来解析如何利用标志变量(Flag)控制线程的生命周期,以及这种方法背后的原理与最佳实践。 ### Java线程停止方法概述 在Java中,直接调用线程的`...

    Java多线程编程线程的协同、停止、暂停、继续等操作实现

    在Java编程中,多线程是并发处理任务的关键技术,它允许程序同时执行多个不同的任务。本篇文章将深入探讨如何实现线程的协同、停止、暂停以及继续等操作,这些都是多线程编程中的核心概念。 1. **线程的协同(协作...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...

    java多线程查询数据库

    在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....

    java多线程处理数据库数据

    在Java编程中,多线程处理是提升程序性能和效率的重要手段,特别是在处理大量数据库数据时。本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    Java的线程和Java AppletJava的线程和Java AppletJava的线程和Java Applet

    5. **线程状态**:Java线程有五种基本状态:新建、可运行、运行、阻塞和死亡。线程的状态转换反映了其生命周期的不同阶段。 6. **线程同步**:为了避免线程间的冲突,Java提供了多种同步机制,如`synchronized`...

    Java多线程练习题

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...

    java多线程进阶

    1. **线程基础**:书中首先会介绍Java多线程的基础知识,包括线程的创建方式(如通过`Thread`类或实现`Runnable`接口)、线程的生命周期(新建、就绪、运行、阻塞和死亡),以及如何启动和停止线程。 2. **线程同步...

    Java多线程下载

    7. **线程通信**:在某些情况下,可能需要线程之间进行通信,例如当某个线程提前完成时,通知其他线程停止工作。可以使用`wait()`、`notify()`或`join()`方法实现线程间的同步。 8. **网络请求库**:通常会用到HTTP...

    Java多线程详解及示例

    Thread类提供了interrupt()方法用于中断线程,但需要注意的是,这并不意味着线程会立即停止,而是在线程检查到中断标志后自行决定是否停止。守护线程(Daemon Thread)是一种特殊线程,当所有非守护线程结束时,守护...

    java多线程设计模式详解(PDF及源码)

    本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...

    Java 多线程介绍

    Java线程有多种状态,主要包括: 1. **New(新建)**:当使用`new`关键字创建一个新的线程对象但尚未调用`start()`方法时,线程处于New状态。 2. **Runnable(可运行)**:一旦调用了`start()`方法,线程便进入...

    java线程强制停止的两个Demo

    下面我们将详细讨论Java中两种常见的线程强制停止的方法,并通过`AlternateStop.java`和`DemoThread.java`这两个示例文件进行解析。 1. **`Thread.stop()` 方法**(不推荐使用) `Thread.stop()` 是Java早期提供的...

    java多线程学习

    Java多线程的学习不仅仅停留在创建和启动线程上,还包括深入理解线程的状态、优先级,以及如何安全地停止线程等问题。例如,线程状态包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。合理地管理...

    JAVA多线程教材

    4. **线程优先级与守护线程**:Java线程有优先级之分,可以影响调度,但实际效果取决于操作系统。守护线程(Daemon Thread)是一种特殊类型的线程,当它是系统中唯一运行的线程时,JVM会自动退出。 5. **并发集合与...

    java多线程经典讲义

    创建Java线程主要有两种方式: 1. 继承Thread类:首先定义一个类继承自Thread,然后重写run()方法。在main方法中创建该类的实例并调用start()方法启动线程。这种方式的缺点是限制了类的继承,因为Java不支持多重...

    java多线程编程实例_Source

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在本实例源码中,包含17个章节和上百个实例,旨在深入讲解Java多线程的核心概念和实际应用。 一、线程基础知识 在Java中,...

Global site tag (gtag.js) - Google Analytics