想象一下这个场景,用户刚刚点了连接数据库后,忽然想起这个数据库没有启动,要等到默认的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资源
分享到:
相关推荐
本文将深入探讨Java线程停止的方法,特别是通过一个示例代码片段来解析如何利用标志变量(Flag)控制线程的生命周期,以及这种方法背后的原理与最佳实践。 ### Java线程停止方法概述 在Java中,直接调用线程的`...
在Java编程中,多线程是并发处理任务的关键技术,它允许程序同时执行多个不同的任务。本篇文章将深入探讨如何实现线程的协同、停止、暂停以及继续等操作,这些都是多线程编程中的核心概念。 1. **线程的协同(协作...
Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...
在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...
在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....
在Java编程中,多线程处理是提升程序性能和效率的重要手段,特别是在处理大量数据库数据时。本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...
5. **线程状态**:Java线程有五种基本状态:新建、可运行、运行、阻塞和死亡。线程的状态转换反映了其生命周期的不同阶段。 6. **线程同步**:为了避免线程间的冲突,Java提供了多种同步机制,如`synchronized`...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...
1. **线程基础**:书中首先会介绍Java多线程的基础知识,包括线程的创建方式(如通过`Thread`类或实现`Runnable`接口)、线程的生命周期(新建、就绪、运行、阻塞和死亡),以及如何启动和停止线程。 2. **线程同步...
7. **线程通信**:在某些情况下,可能需要线程之间进行通信,例如当某个线程提前完成时,通知其他线程停止工作。可以使用`wait()`、`notify()`或`join()`方法实现线程间的同步。 8. **网络请求库**:通常会用到HTTP...
Thread类提供了interrupt()方法用于中断线程,但需要注意的是,这并不意味着线程会立即停止,而是在线程检查到中断标志后自行决定是否停止。守护线程(Daemon Thread)是一种特殊线程,当所有非守护线程结束时,守护...
本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...
Java线程有多种状态,主要包括: 1. **New(新建)**:当使用`new`关键字创建一个新的线程对象但尚未调用`start()`方法时,线程处于New状态。 2. **Runnable(可运行)**:一旦调用了`start()`方法,线程便进入...
下面我们将详细讨论Java中两种常见的线程强制停止的方法,并通过`AlternateStop.java`和`DemoThread.java`这两个示例文件进行解析。 1. **`Thread.stop()` 方法**(不推荐使用) `Thread.stop()` 是Java早期提供的...
Java多线程的学习不仅仅停留在创建和启动线程上,还包括深入理解线程的状态、优先级,以及如何安全地停止线程等问题。例如,线程状态包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。合理地管理...
4. **线程优先级与守护线程**:Java线程有优先级之分,可以影响调度,但实际效果取决于操作系统。守护线程(Daemon Thread)是一种特殊类型的线程,当它是系统中唯一运行的线程时,JVM会自动退出。 5. **并发集合与...
创建Java线程主要有两种方式: 1. 继承Thread类:首先定义一个类继承自Thread,然后重写run()方法。在main方法中创建该类的实例并调用start()方法启动线程。这种方式的缺点是限制了类的继承,因为Java不支持多重...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在本实例源码中,包含17个章节和上百个实例,旨在深入讲解Java多线程的核心概念和实际应用。 一、线程基础知识 在Java中,...