Java并发 | 08.[方法] 线程的生命周期及常用的方法

1. 线程的生命周期

Java线程在生命周期中的某一时刻可能处于一下6种状态的其中一种:

  • [初始状态 - New] 线程被创建出来但并未调用 start( )
  • [运行状态 - Runnable] 线程被调用了 start( ) 后处于就绪或运行状态;
  • [阻塞状态 - Blocked] 阻塞状态,正在等待锁被释放;
  • [等待状态 - Waiting] 该线程需要等待其他线程作出一些特定动作(通知或中断);
  • [超时等待状态 - Time Waiting] 线程在等待指定的时间后会继续执行,目前正处于等待状态;
  • [终止状态 - Terminated] 线程执行完毕。

值得一提的是,在操作系统中有Ready和Running状态,但在JVM中将这两种状态合并成了「Runnable」状态。

Java 线程状态变迁图

2. 常用的方法

方法签名功能描述备注
static Thread Thread.currentThread()获取本线程的Thread对象静态方法
void Thread.start()启动线程并执行线程内的run方法
void Thread.run()执行线程的run方法若在start()之前就调用了run(),并不会启动新线程
而是在当前线程(eg:主线程)直接执行内部的run()
static void Thread.sleep(long m)使线程「休眠」一定时间(单位:ms)静态方法,谁调用谁休眠
Runnable -> Time Waiting
void Thread.yield()使线程「让出」CPU
void Thread.join()使调用的线程「等待」该线程执行完毕通常是在主线程中调用子线程的join(),即主线程「同步等待」子线程
Runnable -> Time Waiting
void Thread.wait()
void Thread.setPriority(int p)设置线程优先级默认5,可设置的范围是1-10,优先级越高的线程抢到时间片的概率越大
void Thread.interrupt()打断线程① 若被打断的线程正处于Time Waiting,则会停止并抛出异常,且将打断标记重置为false;
② 处于Runnable状态的线程不会停止,而仅仅是将打断标记设置为true
boolean Thread.isInterrupt();获取打断标记

2.1. t1.start( ) - 启动线程

// 创建线程
Thread t1 = new Thread(() -> {
   // code here... 
}, "t1");

// 启动线程
t1.start();

image-20220830015851216

2.2. Thread.sleep( long m ) - 谁调用谁休眠

Thread.sleep(1000);		// 休眠1s

image-20220830022042762

2.3. t1.join( ) - 调用者等待t1线程执行完毕

Thread t1 = new Thread(() -> {
    // code here...
}, "t1");

t1.start();

// 当前线程等待t1执行完毕
t1.join();
// code here...

image-20220830020707376

2.4. t1.interruped( ) - 打断

  • 若线程处于 Time Waiting 状态,则会抛出异常并停止执行,且将打断标记重置为false;
  • 若线程处于 Runnable 状态,不会停止执行,而仅仅只是将打断标记设置为true。

image-20220830024538854

image-20220830024657825

2.6. 错误示范:若直接调用了线程的run( )

t1.run()			// 不会开启新的线程,而是在当前线程中执行run()

image-20220830025003156

参考资料

[文章] javaGuide - Java并发常见面试题总结(上)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值