新建一个类继承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接口并重写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状态。
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
可运行状态或者说就绪状态。当我们调用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状态
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
等待状态,当调用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状态
和上面WAITING状态一样,只是有一个等待时间,一般调用如下方法时:sleep(),wait(),join(),LockSupport.parkNanos(),LockSupport.parkUntil(),而且方法带上时间则线程会出现这个状态。
示例同上面的WAITING中的示例
线程等待锁时被阻塞状态。一个线程正在等待进入一个同步代码块时线程会被阻塞或者被调用之后重入一个同步代码块时被阻塞。
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状态:
经过上面的分析,我们可以得到一张线程的生命周期简图:
============================================================================
线程当中有三个关于中断的方法:
-
interrupt():打一个中断标记,并没有实际去中断一个线程。
-
isInterrupted():如果调用了interrupt()方法,则这里会输出true,表示当前线程被中断过。
-
interrupted():静态方法。如果调用了interrupt()方法,则这里会输出true,表示当前线程被中断过,但是这个方法比上面的isInterrupted()方法多做了一件事,那就是线程复位,也就是说,连续两次调用interrupted()方法后,第一次为true,第二次就会变回false。
最后
针对以上面试题,小编已经把面试题+答案整理好了
面试专题
除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习
加入社区: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