Java线程基础、线程之间的共享和协作(二)

序号内容链接
1Java线程基础、线程之间的共享和协作(一)https://blog.csdn.net/baidu_36882394/article/details/106190594
2Java线程基础、线程之间的共享和协作(二)https://blog.csdn.net/baidu_36882394/article/details/106330990
3Java线程基础、线程之间的共享和协作(三)https://blog.csdn.net/baidu_36882394/article/details/106385341
4Java线程基础、线程之间的共享和协作(四)https://blog.csdn.net/baidu_36882394/article/details/106419197

认识Java里的线程

Java天生就是多线程

一个 Java 程序从 main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上 Java 程序天生就是多线程程序,因为执行 main()方法的是一个名称为 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 中断信号的

线程的启动与中止

启动

程序启动的方式有:
Thread的源码注释给出的原话:There are two ways to create a new thread of execution
就是说“有两种方法可以创建新的执行线程”,有图有真相
在这里插入图片描述

X extends Thread;
X.start();
X implements Runnable; 然后交给	Thread 运行
Thread 和 Runnable 的区别

Thread 才是 Java 里对线程的唯一抽象,Runnable 只是对任务(业务逻辑)的抽象。Thread 可以接受任意一个 Runnable 的实例并执行。
其实Thread也就是实现了Runnable接口,提供了更多的方法而已。所以说Thread与Runnable并没有什么区别。如果硬要说有什么区别的话,那就是类与接口的区别,继承与实现的区别。另外最重要的是,学习的时候不要忘了思考哦!

中止

线程自然中止

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

中断

安全的中止则是其他线程通过调用某个线程的interrupt()方法对其进行了中断操作,中断好比其他线程对该线程打了个招呼,“A,你要中断了”,不代表线程A会立刻停止自己的工作,同样的A线程可以不用理会这种中断请求。因为Java里的线程是协作式的,不是抢占式的。线程通过检查自身的中断标志位是否被置为true来进行响应,线程通过 isInterrupted() 来进行判断是否被中断,也可以调用静态方法Thread.interrupted()来进行判断当前线程是否被中断,不过 Thread.interrupted()会同时将中断标识位改写为 false。
如果一个线程处于了阻塞状态(态(如线程调用了 thread.sleep、thread.join、thread.wait 等)),则在线程 在检查中断标志时,如果发现中断标志位为true,则会在这些阻塞方法调用处抛出InterruptedException异常,并且在抛出异常后会立即将线程的中断标志位清除,即重新置为false。
不建议自定义一个取消标志位来中止线程的运行。因为run()里面有阻塞调用时会无法很快检测到取消标志,线程必须从阻塞调用返回后,才会检查这个取消标志。这种情况下,使用中断会更好,因为:
1、一般的阻塞方法,如sleep等本身就支持中断的检查。
2、检查中断标志位的状态和检查取消标志位没什么区别,用中断位的状态还可以避免声明取消标志位,减少资源的消耗。
注意:处于死锁状态的线程无法被中断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值