【线程】——线程的启动和中断

启动一个线程

之前我们已经看到了如何通过覆写 run 方法创建一个线程对象,但线程对象被创建出来并不意味着线程就开始运行
了。

  • 覆写 run 方法是提供给线程要做的事情的指令清单
  • 线程对象可以认为是把 李四、王五叫过来了
  • 而调用 start() 方法,就是喊一声:”行动起来!“,线程才真正独立去执行了。

当我们要启动一个线程的时候为什么要用start方法,而不用run方法
首先我们先看下图

在这里插入图片描述
在这里我们不难发现,无论是调用run方法,还是start方法,他都能够让程序运行起来,那么是不是两个效果时一样的呢?回答:那当然不一样。

1.调用run方法和start方法的区别

  • a).调用start:相当于创建了一个新的线程并且去执行了run方法
  • b).调用run:run方法时普通方法,并不会创建新线程:而start会创建一个新线程
  • c).run方法可以多次调用,而start方法不行
  • 那么为什么start不能多次调用:
  • (1)调用start方法就会创建一个PCB
  • (2)在使用一个链表把PCB连接起来,而当再一次start的时候会创建一个一样的PCB这时候就加不到链表当中去了
    *d).run方法属于自定义的类,而start属于Thread类
    2.如何区分run方法和start方法
    2.1打印线程的名称
    在这里插入图片描述
    2.2我们可以借助jconsole工具来查看在调用run方法和start方法的时候有没有创建新新线程,在这里就不演示了,感兴趣的可以下来看看

注意:当有两个线程的时候,如果t1的start在前,t2的start在后,但是当程序启动时,到底是t1对应的线程先执行,还是t2对应的线程先执行,这个事情不能确定。start的先后顺序,只能代表”创建线程“的先后顺序,操作系统先调度哪个线程上CPU,这个事情时不能确定的

中断一个线程

例如:李四一旦进到工作状态,他就会按照行动指南上的步骤去进行工作,不完成是不会结束的。但有时我们需要增加一些机制,例如老板突然来电话了,说转账的对方是个骗子,需要赶紧停止转账,那张三该如何通知李四停止呢?这就涉及到我们的停止线程的方式了。

目前常见的有以下两种方式:

  1. 通过共享的标记来进行沟通
  2. 调用 interrupt() 方法来通知
    方法一:通过定义一个标识符来控制线程的终止
public class ThreadDemo5 {
    //定义一个标识符,通过控制标识符来控制线程的终止
   private static boolean flag = false;
    public static void main(String[] args) throws InterruptedException {
       Thread thread = new Thread(()->{
               while (!flag) {
                   System.out.println("别打扰我,我正在转账呢");
                   try {
                       Thread.sleep(1000);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
               System.out.println("转账终止");
       });
       thread.start();
       //此时等3s中之后发现有内鬼,然后终止交易
       Thread.sleep(3000);
           System.out.println("有内鬼,终止交易");
           //因为此时有内鬼,然后将标识符设置为true
            flag = true;
    }
}

在这里插入图片描述
方法二:
1.通过interrupt来中断线程

public class ThreadDemo6 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            //调用isInterrupted()
        while (!Thread.currentThread().isInterrupted()){
            System.out.println("我正在转账呢");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //当被中断后打印交易终止
            System.out.println("交易终止");
        });
        thread.start();
        Thread.sleep(3000);
        System.out.println("有内鬼,终止交易");
        //让t1终止,调用线程本身的interrupt
        thread.interrupt();
    }
}

来看看效果
在这里插入图片描述
我们此时发现,虽然报出来异常,但是交易仍然在进行,这是为什么呢?
在这里插入图片描述
当加上break之后看看效果

在这里插入图片描述
2.也可以通过Thread直接调用interrupt,效果与上面的一样
在这里插入图片描述
注意:

  1. Thread.interrupted() 判断当前线程的中断标志被设置,清除中断标志
  2. Thread.currentThread().isInterrupted() 判断指定线程的中断标志被设置,不清除中断标志
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值