关于线程的零基础入门教学
如果不了解的话没关系,可以先看进行学习
守护线程
正常来说,我们主线程创建了一个子线程,我们主线程的运行和子线程是互不影响的,其中一个线程的停止运行并不会影响另外的线程运行
如果我们希望可以有一种方法,使一个线程结束运行了之后可以让另外一个线程也结束运行,这就是守护线程(一般是为工作线程服务对的,当所有的用户线程结束,守护线程自动结束)
我们来通过一个例子来看守护线程的实现
public class ThreadMethod03 {
public static void main(String[] args) throws InterruptedException {
MyDaemonThread myDaemonThread = new MyDaemonThread();
myDaemonThread.start();
for (int i=1;i<=10;i++){
System.out.println("小翼鸣正在辛苦的工作......");
Thread.sleep(1000);
}
}
}
class MyDaemonThread extends Thread {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("小妹和小帅在快乐的聊天");
}
}
}
在上述代码中,我们运行的话两个线程会交替运行,因为子线程是不退出循环的所以会一直运行下去,我们通过改写成守护线程来使它在主线程退出的时候也结束运行
方法如下
//如果我们希望当main线程结束后,子线程自动结束
//只需要将子线程设为守护线程即可
myDaemonThread.setDaemon(true);
我们来看完整代码
public class ThreadMethod03 {
public static void main(String[] args) throws InterruptedException {
MyDaemonThread myDaemonThread = new MyDaemonThread();
//如果我们希望当main线程结束后,子线程自动结束
//只需要将子线程设为守护线程即可
myDaemonThread.setDaemon(true);
myDaemonThread.start();
for (int i=1;i<=10;i++){
System.out.println("小翼鸣正在辛苦的工作......");
Thread.sleep(1000);
}
}
}
class MyDaemonThread extends Thread {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("小妹和小帅在快乐的聊天");
}
}
}
运行结果
线程的生命周期
-
JDK中用Thread.State枚举表示了线程的几种状态
官方给出六种状态
实际上有七种状态(Runnable可以细分两种)
我们再通过一个流程图来好好分析
创建一个线程New,一旦调用了start()方法,就会进入Runnable中的可运行状态,里面又细化出两个状态ready就绪状态和running运行状态
我们再往下看
如果线程处于运行状态之后结束运行,那就进入terminated状态结束运行
如果在Runnable的状态下分别调用了不同的方法,那可能又会进入不同在状态(三条路径),然后再重新进入running状态,然后有可能进入ready有可能进入running。
也就是说
Runnable状态代表可以运行,但是不一定马上running,是否真正地运行要取决于线程调度器(内核调度器),这个不是程序控制的。
我们也可以在图上Runnable中看到当调用了yield方法,实际上是从Running进入了ready状态,是否进入running由内核调度决定