并发初体验-初识多线程

静心、砥砺前行

1 实现多线程的三种方式

1.1继承Thread类重写run方法

Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()方法启动。start()方法是一个native方法,它会启动一个新的线程,并执行run()方法。

1.2实现Runnable接口

因为单继承原因需要实现多线程的话,可以通过实现Runnable接口来完成

1.3实现Callable接口通过FutureTask包装器来创建Thread线程

有的时候,可能需要异步执行的线程在执行完成后,提供一个返回值给到主线程,那么这个时候就需要用到这种带返回值的线程;

2 线程的生命周期

java线程既然能够创建,那么也势必会被销毁,所以线程是存在生命周期的。
线程一共有6种状态

  1. new:初始状态,线程被构建,但是还没有被启动
  2. runnable:运行状态,java线程保操作系统中的就绪和运行两种状态统一称为运行中
  3. blocked:阻塞状态,表示线程进入等待状态,也就是线程因为某种原因放弃了cpu使用权;
  4. waiting:等待被唤醒状态;
  5. time_waiting:在指定时间内等待被唤醒,超时则自动唤醒;
  6. terminated:表示该线程已经执行完毕。
    Alt text

3 显示线程的状态

启动一个线程前最好为这个线程设置线程名称,因为这样在分析程序或者进行问题排查时能更好的定位问题;
在cmd界面或者编辑器终端(如idea terminal)输入jps获取运行进程的pid,继续输入jstack pid就可以获取到相应的信息

4 线程的终止

线程得到启动过程比较常见,但是如何终止一个线程呢?
线程的终止,并不是简单的调用stop命令。虽然api仍然可以使用,但是和suspend、resume一样都是过期的方法不建议使用。stop方法在结束一个线程时被不会保证线程的资源正常释放,因此可能会出现一些不确定的状态(如:死锁)。

interrupt()方法

当其他线程通过调用当前线程的interrupt方法,表示向当前线程通信,告诉他可以中断执行了,但是不一定会立即中断(取决于当前线程自己)

interrupted()方法

线程中提供了静态方法interrupted对设置终端标识的线程复位。除了调用interrupted方法进行复位以外,还有一种被动复位的场景,就是对外抛出interruptedException异常;在抛出interruptedException前jvm会先把中断的标识复位;

本文如有错误或不足之处望指出,感谢浏览!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值