1、创建一个线程
public class MyThread{
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName());
}
}).start();
System.out.println(Thread.currentThread().getName());
}
}
// 多次打印的结果:
// mian
// Thread-0
问题1:这段代码是输出当前线程,首先打印了 主线程、接着是 Thread-0
1> 为什么写的是 Thread-0 ?
这个具体的可以区看源码,源码中返回的格式就是这样,并且线程数是从 0 开始的
2> mian线程第8行和Thread-0第5行是可以并行执行的,为什么没有先打印 Thread-0?
注意: 线程是同步的,main会最先启动加载(jym直接启动),但是其他线程启动后和main是同步运行的
第一:这段程序的打印结果顺序是不确定的,但是大部分情况都会先打印main
第二:执行到 7 启动当前线程时候,main线程还处于运行态的。而创建线程需要申请操作系统,进行系统级别的线程创建,申请系统级别的调度比较耗时,所以此时打印会出现这样的情况
问题2:为什么第 2 行可以直接new 一个接口
这是匿名内部类(隐式的继承一个类或者实现一个接口,可理解为继承了该类或实现该接口的子类匿名对象)
关于以上第 3 行,可以认为:
new Runnabler() 是创建了一个实现Runnable()接口匿名类的对象,通过new表达式Runnable向上转型成了Object类型,那么这里实际上调用了Object类中的构造方法,
小结:只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现
2、中断线程
常见的两种方式:
- 通过共享标记来进行沟通
- 调用 interrupt() 方法
通过 thread 对象调用 interrupt() 方法通知该线程停止运行
thread 收到通知的方式有两种:
1> 如果线程调用了 wait/join/sleep 等方法而阻塞挂起,则以 InterruptedException 异常的形式通知,清除
中断标志
2> 否则,只是内部的一个中断标志被设置,thread 可以通过
Thread.interrupted() 判断当前线程的中断标志被设置,清除中断标志
Thread.currentThread().isInterrupted() 判断指定线程的中断标志被设置,不清除中断标志