线程的简单问题

skycncomp 2005-11-21 01:27:43
public class Test extends Thread {
public void run() {
try {
sleep(3000);
} catch (InterruptedException e) {
System.out.println("中断");
}
System.out.println("继续执行");
}

public static void main(String[] args) {
Test t = new Test();
Thread th = new Thread(t);
th.start();
th.interrupt();
for (int i = 0; i < 1000; i++)
;
System.out.println("中止");
}
}

为什么要我调用了interrupt()这个方法后,
System.out.println("继续执行");这行代码还会打印出来呢?
是因为它我调用interrupt()后出现异常,所以异常后面的代码会执行吗?
...全文
260 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
skycncomp 2005-11-23
  • 打赏
  • 举报
回复
回复人: treeroot(旗鲁特) ( ) 信誉:106 2005-11-22 13:43:00 得分: 0


事实上interrupt是不能终止一个线程,目前没有很好的办法直接终止一个线程.
当然stop方法是可以的,但是这个方法容易造成死锁,已经强烈建议不要使用了.

interrupt方式只是置一个标志位而已,当然如果线程本身在wait或者sleep就会抛出一个异常.


treeroot(旗鲁特)说的对,interrupt是不能真正终止一个线程的



nighthawk(我们孤单,我们并肩) ( ) 信誉:76 2005-11-22 15:12:00 得分: 0


If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.


nighthawk(我们孤单,我们并肩) 这段JDK描述同样,当调用sleep()方法后,如果调用interrupt之后会抛出异常

昨天我资料说,当sleep()抛出异常后,interrupt设置的终止线程标致将同样清除?
我觉得可能就是这个原因导致后面还可以执行。

不知道对不对,请理解的人给解释一下。
funcreal 2005-11-23
  • 打赏
  • 举报
回复
try{
while(!interrupted()&&has more work to do){
do more work...
}
}catch(InterruptedException e){
//interrupted while sleep
}
一个线程应该不时地检查自己是否应该退出,如果被别人强制终止,则会带来意想不到的灾难。
可以用interrupted()来检查,别人调用了interrupt(),则他的interrupted()就返回true
aaa2003gf 2005-11-22
  • 打赏
  • 举报
回复
学习
skycncomp 2005-11-22
  • 打赏
  • 举报
回复
是不是出现异常后,异常处理的优化级高手我设置的那个线程,
所以后边的代码会执行呢?

gs给解释一下
skycncomp 2005-11-22
  • 打赏
  • 举报
回复
自己顶一下
skycncomp 2005-11-22
  • 打赏
  • 举报
回复
顶一下
skycncomp 2005-11-22
  • 打赏
  • 举报
回复
我是说 nighthawk(我们孤单,我们并肩)

skycncomp 2005-11-22
  • 打赏
  • 举报
回复
我觉得楼上你没有明白我的意思,

可以看一下前边我的回复
zeq258 2005-11-22
  • 打赏
  • 举报
回复
不太懂,但是我觉得这个很有道理:
-----------------------------------------------

回复人: treeroot(旗鲁特) ( ) 信誉:106 2005-11-22 13:43:00 得分: 0


事实上interrupt是不能终止一个线程,目前没有很好的办法直接终止一个线程.
当然stop方法是可以的,但是这个方法容易造成死锁,已经强烈建议不要使用了.

interrupt方式只是置一个标志位而已,当然如果线程本身在wait或者sleep就会抛出一个异常.



nighthawk 2005-11-22
  • 打赏
  • 举报
回复
If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
skycncomp 2005-11-22
  • 打赏
  • 举报
回复
interrupt方式只是置一个标志位而已,当然如果线程本身在wait或者sleep就会抛出一个异常.

设置这个标志有意义是什么呢?
如果我没有sleep()这个方法,而在run()方法里面有很长的一段运行时间,
public void run() {
while (flag) {}
}

我在主程序里调用interrupt方面,对run有什么作用吗?设置这个标记能告诉jvm什么时候中止线程还是一直在等到我的flag为false时才退出呢?
treeroot 2005-11-22
  • 打赏
  • 举报
回复
事实上interrupt是不能终止一个线程,目前没有很好的办法直接终止一个线程.
当然stop方法是可以的,但是这个方法容易造成死锁,已经强烈建议不要使用了.

interrupt方式只是置一个标志位而已,当然如果线程本身在wait或者sleep就会抛出一个异常.
skycncomp 2005-11-22
  • 打赏
  • 举报
回复
那在这个程序里,我interrupt还有什么作用呢?
难到我中断这个线程,
try catch不是通过我这个线程来执行的,
还有其它的线程来控制try catch语句吗?
shine333 2005-11-22
  • 打赏
  • 举报
回复
try - catch

有点像一个人做了坏事被关了起来(catch),但是一旦刑满释放,他的正常权利照样不能剥夺啊
skycncomp 2005-11-22
  • 打赏
  • 举报
回复
再顶一下
quincy1984 2005-11-21
  • 打赏
  • 举报
回复
好象是哦,好象那个线程根本就没有被中断了一样的??`
skycncomp 2005-11-21
  • 打赏
  • 举报
回复
我知道catch后边的代码是会执行的

而我想明白的是我已经中断线程不让它在执行了,
难到中断的意思只是告诉它你可能不充许执行了?
但线程还是把本次执行完毕吧
quincy1984 2005-11-21
  • 打赏
  • 举报
回复
如果是这样:
public class TestThreadInter extends Thread
{
public void run()
{
try
{
sleep(3000);
System.out.println("继续执行");
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}

}
public static void main(String[] args)
{
TestThreadInter t=new TestThreadInter();
Thread th=new Thread(t);
th.start();
th.interrupt();//中断该线程
for (int i=0;i<1000;i++);
System.out.println("中止");
}
}
这个System.out.println("继续执行");就不会被执行了
quincy1984 2005-11-21
  • 打赏
  • 举报
回复
我明白楼主为什么以为:System.out.println("继续执行");会不执行了

只是try{}语句里面如果产生了异常,try{}语句体内剩下的语句才不会被执行,

上面的System.out.println("继续执行");是在try...catch语句后面,当然是会执行的啦
treeroot 2005-11-21
  • 打赏
  • 举报
回复
为什么不出来?catch中你又没有return!
学习并掌握C++2.0(11+14+17+20)的新特性,学习线程及线程池的应用 ---------------------------------------------------给小白学员的3年学习路径及计划技术方面分三块:1.纯开发技术方向2.音视频流媒体专业方向3.项目实战---------------------------------------------------1.纯开发技术方向(1) C++必须要过硬(至少学会10本经典好书)(2) 系统级编程(Windows、Linux),必须特别熟练系统API,灵活运用(3) 框架与工具(Qt、MFC):必须精通其中一种。(4) 架构与设计模式:需要提升一个高度,不再是简单的编码,而是思维模式。(5) 驱动级别(如果有兴趣,可以深入到驱动级:包括Windows、Linux)(6) 最好学习点Java+Html+javascript等WEB技术。2.音视频流媒体专业方向(1) 音视频流媒体基础理论:   必须认真学会,否则看代码就是看天书(2) 编解码方向:精通h.264,h.265(hevc), 包括理论和各个开源库(ffmpeg,libx264,libx265,...)。(3) 直播方向:  精通各种直播协议(rtsp,rtmp,hls,http-flv,...), 钻研各个开源库(live555,darwin,srs,zlmediakit,crtmpserver,...)(4) 视频监控:  理论+开源库(onvif+281818)(EasyMonitor、iSpy、ZoneMinder(web)、...) 3.项目实战(1) Qt项目:  至少要亲手练习10个实战项目(网络服务器、多线程、数据库、图像处理、多人聊天、等等)(2)音视频项目:包括编解码、视频监控、直播等各个方向,都需要亲手实战项目,包括视频服务器、后台管理系统、前端播放器(多端)---------------------------------------------------  第1章 C++11新特性 41). nullptr关键字与新语法 42). auto和decltype类型推导 6 auto讲解 6 auto示例 7 decltype 83). for区间迭代 94). 初始化列表 105). 模板增强 11外部模板 11类型别名模板 12默认模板参数 126). 构造函数 13委托构造 13继承构造 147). Lambda 表达式 158). 新增容器 20std::array 20std::forward_list 21无序容器 22元组 std::tuple 239). 正则表达式 2610). 语言级线程支持 28多线程库简介 2811). 右值引用和move语义 31右值引用和move语义 32转移左值 3412). constexpr 35第2章 C++14新特性 36Lambda 函数 36类型推导 37返回值类型推导(Return type deduction) 37泛型lambda 39[[弃用的]]  [[deprecated]]属性 40二进制数字和数字分隔符 41第3章 C++17新特性 42安装GCC10.2 42安装msys2-x86_64-20200720 42更新镜像 42更新软件库 43安装 MinGW64 等必要的软件 43环境变量Path 43编译命令 43constexpr 44typename 45折叠表达式 47结构化绑定 48条件分支语句初始化 49聚合初始化 50嵌套命名空间 52lambda表达式捕获*this的值 53改写/继承构造函数 54用auto作为非类型模板参数 55__has_include 56fallthrough 57nodiscard 57maybe_unused 58第4章 C++20新特性 59编译命令 59concept 59typename 60explicit 61constinit 62位域变量的默认成员初始化 62指定初始化 63基于范围的for循环初始化 64放宽基于范围的for循环,新增自定义范围方法 65嵌套内联命名空间 66允许用圆括弧的值进行聚合初始化 67unicode字符串字面量 68允许转换成未知边界的数组 68likely和unlikely 69第5章 C++2.0(11/14/17/20)总结与分析 705.1 C语言与C++ 715.2 语言可用性的强化 725.2.1 常量 725.2.2 变量及其初始化 735.2.3 类型推导 745.2.4 控制流 765.2.5 模板 775.2.6 面向对象 815.3 语言运行期的强化 835.3.1 Lambda 表达式 835.3.2 右值引用 865.4 容器 885.4.1 线性容器 885.4.2 无序容器 895.4.3 元组 895.5 智能指针与内存管理 905.5.1 RAII 与引用计数 905.5.2 std::shared_ptr 905.5.3 std::unique_ptr 915.5.4 std::weak_ptr 91第6章 C++2.0多线程原理与实战 93什么是并发 93并发的方式 93为什么使用并发 95线程简介 96创建线程的三种方式 971. 通过函数 972.通过类对象创建线程 993.通过lambda表达式创建线程 101thread线程的使用 101互斥量与临界区 105期物Future 111条件变量 112原子操作 114内存模型 118第7章 C++2.0线程池原理与实战 120线程与线程池的基本原理 1201)、线程 1202)、线程的生命周期 1213)、什么是单线程和多线程 1214)、线程池 1225)、四种常见的线程池 123线程池的架构与流程 123线程池代码实战 125    

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧