sec.setDaemon(true);
thr.setDaemon(true);
//启动
sec.start();
thr.start();
//之后发现sec和thr是守护线程,就会中断
- 中断线程:
public void interrupt()
:让一个线程控制另外一个线程(有条件的:受阻),可以利用该方法终止另一个线程的运行
1. 如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 等阻塞方法处于阻塞状态,它还将收到一个 InterruptedException
2. 中断一个不处于活动状态的线程不需要任何作用。
中断一个不处于阻塞状态的线程,没有其他任何效果
public class Test {
public static void main(String[] args) {
FiveThread fiveThread = new FiveThread();
fiveThread.start();
//在主线程中,终止fiveThread,休眠状态
fiveThread.interrupt();
}
}
// 睡5秒之后,再让该线程输出一句话
class FiveThread extends Thread{
@Override
public void run() {
try {
//假如申请了很多的系统资源
TimeUnit.SECONDS.sleep(5);
System.out.println(“FiveThread 睡醒了”);
} catch (InterruptedException e) {
e.printStackTrace();
//异常的意义:即使我的线程被异常终止,我也可以保证资源的正常释放
}
}
}
//会抛出 java.lang.InterruptedException: sleep interrupted
4. JAVA程序的运行原理
- Java命令会启动 JVM,即启动了一个进程,该进程会启动一个主线程,然后主线程调用某个类的 main方法,所以 main方法 都是运行在主线程里
- jvm 启动后,必然有一个执行路径(线程)从 main方法开始的,一直执行到 main方法结束,这个线程在Java中称之为
主线程
。 - 当程序的主线程执行时,如果遇到了循环而导致程序在指定位置停留时间过长,则无法马上执行下面的程序,需要等待循环结束后能够执行
方法在哪个线程中被调用,它就运行在哪个线程中
- JVM 是一个多线程程序,每个Java 进程都分配一个 JVM 实例
public class ThreadDemo {
public static void main(String[] args) {
//利用垃圾回收器来证明
while(true) {
//这里虽然一直在堆空间中,创建数组对象,
// 但是始终没有耗尽堆空间,就是因为垃圾回收器,
// 在另外一个线程中,帮我们回收垃圾,所以才不会耗尽heap内存
// 从而证明,jvm是线程的
int[] ints = new int[1024];
ints = null;
}
}
}
二、Thread 类
1. 概述
- Thread是程序中的执行线程。Java 虚拟机允许应用程序并发地