`
rabby
  • 浏览: 165952 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

java停止线程方法

阅读更多
class threadtest extend Thread{
	//skip some code..

	boolean runflag=true; 

	public synchronized void stopthread()
	{
		runflag=false; 
	}

	public synchronized boolean getrunflag()
	{
		return runflag; 
	} 

	public void run() {
		runflag=true;
		try {
			while (getrunflag()) {
				//code1;
				//code2; 
				//put your code here
			}
		}catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println(this.getClass().getName()+" stopped");
	}
}

 

这样,每当需要停止该线程时,只需调用stopthread()即可。

这里有两点需要注意:

1)我们用了一个同步方法getrunflag()来得到当前的状态,为什么用这个方法而不是直接使用while(runflag)呢?
这个是因为在java的多线程模型中,有一个公共的对象存储区,但是每个对象都有自己的私有备份,当一个线程改变了状态,jvm并不能保证这个线程改变过的变量即时更新公共对象存储区的状态,可能(可能性不大)造成问题。
所以建议有好的设计习惯,采用同步方法来获得当前的runflag值。

2)还有一点,特别是涉及网络的多线程,如果发生了网络阻塞(在while循环里面发生),那么,即使runflag状态比如改变成false,由于程序被阻塞,线程用这种方法是永远都不会被停止的。
举个例子:比如上面的程序,如果code1是一段网络程式,如果在code1发生了阻塞,阻塞的意义就是得不到请求的资源,在无限期等待,这个时候,runflag状态的变化对while循环是起不了作用的,线程不会被停止。此时,可以使用thread.interrupt()来停止线程。

分享到:
评论

相关推荐

    JAVA线程停止的方法

    4. **停止线程**:`public void stop()`方法中,将`flag`设置回`false`,从而使得`while`循环退出,线程停止运行。 ### 最佳实践与注意事项 虽然使用标志变量是一种优雅的线程停止策略,但在实际应用中还需注意...

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

    Java提供了一种不推荐的方式来停止线程,即使用`Thread.stop()`,但这个方法不安全,因为它可能导致数据不一致和资源泄露。更好的做法是使用标志变量,如`volatile boolean stopRequested`,当主线程或其他线程想要...

    Java多线程知识点总结

    Java提供了多种机制来保证线程安全,比如使用synchronized关键字来同步方法或代码块,实现线程之间的同步。当一个线程试图进入一个已经被另一个线程持有的同步代码块时,它将进入阻塞状态,直到同步代码块的执行线程...

    java多线程的讲解和实战

    9. **线程中断**:`interrupt()`方法可以标记线程中断状态,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求,从而优雅地停止线程执行。 10. **线程局部变量(ThreadLocal)**:为每个线程...

    java 多线程并发实例

    Java的Thread类提供了start()来启动线程,interrupt()来中断线程,但需要注意的是,中断并不一定能立即停止线程,线程需要自行检查并响应中断状态。 另外,可能还会涉及到死锁、活锁和饥饿等并发问题,这些都是多...

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

    1. Thread.interrupt():用于中断线程,但不一定立即停止,需要在run()方法内部检查中断标志并作出相应处理。 2. InterruptedException:线程被中断时抛出的异常,通常需要捕获并处理。 九、线程死锁 1. 死锁的概念...

    java多线程查询数据库

    通常,我们需要确保线程池的`shutdownNow()`方法可以在遇到错误时停止所有任务,并在主线程中处理异常。 ### 8. 性能优化与调优 在实际应用中,我们还需要关注查询性能,比如使用预编译的SQL(PreparedStatement)...

    java多线程处理数据库数据

    通过以上方法,我们可以在Java中有效地利用多线程处理数据库数据,提高程序的并发能力和效率。记得在设计时充分考虑线程间的协作与同步,以及数据库连接的管理和优化,以确保程序的稳定性和性能。

    java 多线程设计模式 进程详解

    线程的启动、停止和连接 总结 第三章 同步技术 银行的例子 异步读取数据 一个进行同步操作的类 同步块 嵌套锁 死锁 返回到银行的例子 同步静态方法 总结 第四章 等待和通知 返回到银行的例子 等待和通知 wait...

    Java多线程练习题

    Thread类提供了interrupt()方法用于中断线程,但是需要注意的是,中断并不是立即停止线程,而是设置一个中断标志,线程需要在适当的地方检查这个标志并处理中断。 通过对以上知识点的深入理解和实践,开发者可以...

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

    单线程程序 多线程程序 Thread类的run方法和start方法 线程的启动 线程的启动(1)——利用Thread类的子类 线程的启动(2)——利用Runnable接口 线程的暂时停止 线程的共享互斥 synchronized方法 synchronized阻挡 ...

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

    6. **线程同步**:为了避免线程间的冲突,Java提供了多种同步机制,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法、`Lock`接口及相关的实现类。 **Java Applet**是Java在Web环境中的一种应用...

    Java 多线程介绍

    `suspend()`方法用于暂时停止一个线程的执行,而`resume()`方法则用于恢复之前被`suspend()`方法挂起的线程。然而,这两个方法存在一些问题,导致它们在Java中被视为不安全且过时的。 #### 问题一:死锁风险 使用`...

    java多线程学习

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

    java多线程进阶

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

    Java多线程--等待所有子线程执行完的五种方法.docx

    我们可以通过`ExecutorService`启动多个线程,然后调用`shutdown()`来停止接收新任务,并等待所有已提交的任务完成。我们可以使用`isTerminated()`检查线程池是否已经完全关闭,即所有任务都已完成。 ```java ...

    Java多线程详解及示例

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

    java多线程测试实例

    - `interrupt()`方法用于中断线程,但这并不意味着线程会立即停止,而是设置中断标志,线程需在适当位置检查`isInterrupted()`或`interrupted()`方法来响应中断。 - 守护线程(Daemon Thread)是一种后台线程,当...

    Java多线程下载

    Java多线程下载技术是Java开发中用于提升大文件下载效率的一种常见方法。在传统的单线程下载过程中,网络请求可能会因为各种原因中断,如网络波动、服务器问题或用户操作等,这会导致需要从头开始下载,浪费时间和...

    JAVA多线程教材

    Java提供了Thread.interrupt()和isInterrupted()方法来支持线程的中断,这是一种优雅的停止线程执行的方式。 7. **Future与Callable接口**:Future接口代表异步计算的结果,而Callable接口允许线程返回一个结果,与...

Global site tag (gtag.js) - Google Analytics