创建、中断线程之匿名内部类的使用

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() 判断指定线程的中断标志被设置,不清除中断标志
发布了52 篇原创文章 · 获赞 6 · 访问量 1439

猜你喜欢

转载自blog.csdn.net/qq_40488936/article/details/104934406