全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java 如何正确停止一个线程 如何停止 java 的线程一直是一个开发多线程程序常遇到的一个问题。也有好多同学问过, 所以今天在这里总结一下希望可以让更多的人知道在 java 中如何安全的结束一个正在运行 的线程。 在 Java 的多线程编程中,java.lang.Thread 类型包含了一些列的方法 start(), stop(), stop(Throwable) and suspend(), destroy() and resume()。通过这些方法,我们可以对线程进行 方便的操作,但是这些方法中,只有 start()方法得到了保留。 那么,我们究竟应该如何停止线程呢?这里我们介绍两种方法: 1. 使用共享变量的方式 在这种方式中,之所以引入共享变量,是因为该变量可以被多个执行相同任务的线程用来 作为是否中断的信号,通知中断线程的执行。 public class ThreadFlag extends Thread public volatile boolean exit = false; public void run() while (!exit); public static void main(String args) throws Exception ThreadFlag thread = new ThreadFlag(); thread.start(); sleep(3000); / 主线程延迟 3 秒 thread.exit = true; / 终止线程 thread thread.join(); System.out.println(“线程退出!“); 在上面代码中定义了一个退出标志 exit,当 exit 为 true 时, while 循环退出,exit 的默认值 为 false。在定义 exit 时,使用了一个 Java 关键字 volatile,这个关键字的目的是使 exit 同 步,也就是说在同一时刻只能由一个线程来修改 exit 的值。 建议使用如下的方法来停止线程: private volatile Thread blinker; public void stop() blinker = null; public void run() Thread thisThread = Thread.currentThread(); while (blinker = thisThread) try thisThread.sleep(interval); catch (InterruptedException e) repaint(); 2. 使用 interrupt 方法终止线程 如果一个线程由于等待某些事件的发生而被阻塞,又该怎样停止该线程呢? 这种情况经常会发生,比如当一个线程由于需要等候键盘输入而被阻塞,或者调用 Thread.join()方法,或者 Thread.sleep()方法,在网络中调用 ServerSocket.accept()方法,或者 调用了 DatagramSocket.receive()方法时,都有可能导致线程阻塞,使线程处于处于不可运 行状态时,即使主程序中将该线程的共享变量设置为 true,但该线程此时根本无法检查循 环标志,当然也就无法立即中断。 这里我们给出的建议是,不要使用 stop()方法,而是使用 Thread 提供的 interrupt()方法,因 为该方法虽然不会中断一个正在运行的线程,但是它可以使一个被阻塞的线程抛出一个中 断异常,从而使线程提前结束阻塞状态,退出堵塞代码。 class MyThread extends Thread volatile boolean stop = false; public void run() while (!stop) System.out.println(getName() + “ is running“); try sleep(1000); catch (InterruptedException e) System.out.println(“week up from blcok.“); stop = true; / 在异常处理代码中修改共享变量的状态 System.out.println(getName() + “ is exiting.“); class InterruptThreadDemo3 public static void main(String args) throws InterruptedException MyThread m1 = new MyThread(); System.out.println(“Starting thread.“); m1.start(); Thread.sleep(3000); System.out.println(“Interrupt thread.: “ + m1.getName(); m1.stop = true; / 设置共享变量为 true errupt(); / 阻塞时退出阻塞状态 Thread.sleep(3000); / 主线程休眠 3 秒以便观察线程 m1 的中断情况 System.out.println(“Stopping application.“); 注意:在 Thread 类中有两个方法可以判断线程是否通过 interrupt 方法被终止。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年花卉保养服务协议范本
- 2023-2024学年浙江省温州市苍南县金乡卫城中学高三5月第二次联考数学试题文试卷
- 2023-2024学年浙江省金兰教育合作组织高三下学期质量调查(一)数学试题
- 2024年设计服务外包协议范本2
- 2024年深度钻井工程服务协议
- 2024年荒山开发承包协议样本
- 2024年个人消费贷款协议模板指南
- 2024年适用车辆租赁长租协议样式
- 底商租赁协议精简(2024年)
- 2024移动网络运营商服务协议
- CA码生成原理及matlab程序实现
- 国家开放大学《电气传动与调速系统》章节测试参考答案
- 须弥(短篇小说)
- 旋风除尘器设计与计算
- 《装配基础知识培训》
- 出口退税的具体计算方法及出口报价技巧
- PCB镀层与SMT焊接
- Unit 1 This is my new friend. Lesson 5 课件
- 2019年青年英才培养计划项目申报表
- 芳香油的提取
- 企业人才测评发展中心建设方案
评论
0/150
提交评论