【并发编程系列1】Thread生命周期及interrupted()作用分析


新建一个类继承Thread类并重写run()方法:

package com.zwx.thread;

public class MyThread extends Thread {

@Override

public void run() {

System.out.println(“111”);

}

}

package com.zwx.thread;

public class CreateThreadDemo{

public static void main(String[] args) {

MyThread myThread = new MyThread();

myThread.start();

}

}

实现Runnable接口


新建一个类实现Runnable接口并重写run()方法:

package com.zwx.thread;

public class MyThread1 implements Runnable {

@Override

public void run() {

System.out.println(“111”);

}

}

package com.zwx.thread;

public class CreateThreadDemo{

public static void main(String[] args) {

MyThread1 myThread1 = new MyThread1();

Thread thread = new Thread(myThread1);

thread.start();

}

}

创建线程简写形式


上面是线程的两种基本形式,我们有时候创建线程也可以用下面的简写形式进行直接创建:

package com.zwx.thread;

public class CreateThreadDemo{

public static void main(String[] args) {

Thread t1 = new Thread(new Runnable() {

@Override

public void run() {

System.out.println(“我是t1”);

}

},“t1”);

t1.start();

new Thread(()->{

System.out.println(“我是t2”);

},“t2”).start();

}

}

线程的生命周期

====================================================================

线程中总共有六种状态。

NEW


NEW表示线程尚未启动的状态,即当我们new 一个线程时,线程就是NEW状态。

package com.zwx.thread;

public class ThreadState {

public static void main(String[] args) {

Thread t1 = new Thread(()->{

System.out.println(“我是t1线程”);

});

System.out.println(t1.getState());

}

}

上面输出的状态就是:NEW

RUNNABLE


可运行状态或者说就绪状态。当我们调用thread.start()之后,线程就进入RUNNABLE状态,注意,调用start()方法之后线程并不一定会马上执行,还要看操作系统的调度才能执行。

package com.zwx.thread;

public class ThreadState {

public static void main(String[] args) {

Thread t1 = new Thread(()->{

System.out.println(“我是t1线程”);

});

System.out.println(t1.getState());//NEW

t1.start();

System.out.println(t1.getState());//RUNNABLE

}

}

上面的第二个输出语句中线程t1的状态就是RUNNABLE状态

TERMINATED


package com.zwx.thread;

public class ThreadState {

public static void main(String[] args) throws InterruptedException {

Thread t1 = new Thread(()->{

System.out.println(“我是t1线程”);

});

System.out.println(t1.getState());//NEW

t1.start();

Thread.sleep(1000);

System.out.println(t1.getState());//TERMINATED

}

}

t1线程启动之后,我们把主线程休眠1s,t1执行完毕之后再看t1的状态就是TERMINATED

WAITING


等待状态,当调用wait(),join()或者park()方法时,线程就会处于WAITING等待状态

package com.zwx.thread;

public class ThreadState {

public static void main(String[] args) throws InterruptedException {

new Thread(()->{

while (true){

synchronized (ThreadState.class){

System.out.println(“我是t1线程”);

try {

ThreadState.class.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

},“t1”).start();

new Thread(()->{

while (true){

System.out.println(“我是t2线程”);

try {

Thread.sleep(20000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

},“t2”).start();

}

}

运行之后通过jps和jstack命令可以看到t2线程就是TIMED_WAITING状态,而t1就是WAITING状态

在这里插入图片描述

TIMED_WAITING


和上面WAITING状态一样,只是有一个等待时间,一般调用如下方法时:sleep(),wait(),join(),LockSupport.parkNanos(),LockSupport.parkUntil(),而且方法带上时间则线程会出现这个状态。

示例同上面的WAITING中的示例

BLOCKED


线程等待锁时被阻塞状态。一个线程正在等待进入一个同步代码块时线程会被阻塞或者被调用之后重入一个同步代码块时被阻塞。

package com.zwx.thread;

public class ThreadState {

static class BlockDemo extends Thread{

@Override

public void run() {

synchronized (BlockDemo.class){

while (true){

}

}

}

}

public static void main(String[] args) {

new Thread(new BlockDemo(),“t3”).start();

new Thread(new BlockDemo(),“t4”).start();

}

}

上面示例中t3和t4争抢同一把锁进入同步代码块,那么一定会有一个线程处于BLOCKED状态:

在这里插入图片描述

线程生命周期图


经过上面的分析,我们可以得到一张线程的生命周期简图:

在这里插入图片描述

interrupted()作用

============================================================================

线程当中有三个关于中断的方法:

  • interrupt():打一个中断标记,并没有实际去中断一个线程。

  • isInterrupted():如果调用了interrupt()方法,则这里会输出true,表示当前线程被中断过。

  • interrupted():静态方法。如果调用了interrupt()方法,则这里会输出true,表示当前线程被中断过,但是这个方法比上面的isInterrupted()方法多做了一件事,那就是线程复位,也就是说,连续两次调用interrupted()方法后,第一次为true,第二次就会变回false。

最后

针对以上面试题,小编已经把面试题+答案整理好了

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

面试专题

image

除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习

image

image

image

加入社区:https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0
ed()方法后,第一次为true,第二次就会变回false。

最后

针对以上面试题,小编已经把面试题+答案整理好了

[外链图片转存中…(img-3rppbNjh-1725532329130)]

[外链图片转存中…(img-GOnwxQ2O-1725532329130)]

[外链图片转存中…(img-sNu2rprr-1725532329131)]

面试专题

[外链图片转存中…(img-rtOyJXMb-1725532329131)]

除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习

[外链图片转存中…(img-xnoJaiyH-1725532329132)]

[外链图片转存中…(img-BEXOGSb6-1725532329132)]

[外链图片转存中…(img-WsKGYc9l-1725532329132)]

加入社区:https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值