中国信息港 [切换城市] 联系客服
您的位置:首页 >科技>详情

并发编程干货!Java 程序天生就是多线程的

来源:中国信息港 分类:科技 时间:2020-05-09 浏览量:

本文地址:http://www.kdyj.com/article/detail/1206.html

导语: 一个Java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上Java程序天生就是多线程程序,因为执行main()方法的是一个名称为main的线程

一个 Java 程序从 main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上 Java 程序天生就是多线程程序,因为执行 main()方法的是一个名称为 main 的线程。

[1] main //main 线程,用户程序入口
[2] Reference Handler//清除 Reference 的线程
[3] Finalizer // 调用对象 finalize 方法的线程
[4] Signal Dispatcher // 分发处理发送给 JVM 信号的线程
[5] Attach Listener //内存 dump,线程 dump,类信息统计,获取系统属性等
[6] Monitor Ctrl-Break //监控 Ctrl-Break 中断信号的

线程的启动与中止

启动

启动线程的方式有:

1、X extends Thread;,然后 X.start

2、X implements Runnable;然后交给 Thread 运行

Thread 和 Runnable 的区别

Thread 才是 Java 里对线程的唯一抽象,Runnable 只是对任务(业务逻辑)的抽象。Thread 可以接受任意一个 Runnable 的实例并执行。

中止

线程自然终止:要么是 run 执行完成了,要么是抛出了一个未处理的异常导致线程提前结束。

stop:暂停、恢复和停止操作对应在线程 Thread 的 API 就是 suspend() 、resume()和 和 stop()。但是这些 API 是过期的,也就是不建议使用的。不建议使用的原因主要有:以 suspend()方法为例,在调用后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入睡眠状态,这样容易引发死锁问题。同样,stop()方法在终结一个线程时不会保证线程的资源正常释放,通常是没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定状态下。正因为 suspend()、resume()和 stop()方法带来的副作用,这些方法才被标注为不建议使用的过期方法。

中断:安全的中止则是其他线程通过调用某个线程 A 的 interrupt()方法对其进行中断操作, 中断好比其他线程对该线程打了个招呼,“A,你要中断了”,不代表线程 A 会立即停止自己的工作,同样的 A 线程完全可以不理会这种中断请求。线程通过检查自身的中断标志位是否被置为 true 来进行响应,线程通过方法 isInterrupted()来进行判断是否被中断,也可以调用静态方法Thread.interrupted()来进行判断当前线程是否被中断,不过 Thread.interrupted()会同时将中断标识位改写为 false。

如果一个线程处于了阻塞状态(如线程调用了 thread.sleep、thread.join、thread.wait 等),则在线程在检查中断标示时如果发现中断标示为 true,则会在这些阻塞方法调用处抛出 InterruptedException 异常,并且在抛出异常后会立即将线程的中断标示位清除,即重新设置为 false。

不建议自定义一个取消标志位来中止线程的运行。因为 run 方法里有阻塞调用时会无法很快检测到取消标志,线程必须从阻塞调用返回后,才会检查这个取消标志。这种情况下,使用中断会更好,原因如下:

  • 一般的阻塞方法,如 sleep 等本身就支持中断的检查;

  • 检查中断位的状态和检查取消标志位没什么区别,用中断位的状态还可以避免声明取消标志位,减少资源的消耗;

注意 :处于死锁状态的线程无法被中断!!!

免责声明:本文章注明的文章来源于网络、自媒体综合提供的内容均源自网络、自媒体,版权归原作者所有,转载请联系原作者并获许可,文章观点仅代表作者本人,不代表本网站立场,如对本文内容有异议,请联系网站底部客服邮箱申请撤稿,我们会核实后处理。

扫码关注微信

扫码关注微信