Java教程

2021我的Java路要怎么走,【线程】(2)

本文主要是介绍2021我的Java路要怎么走,【线程】(2),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

当我们要启动一个线程的时候为什么要用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();

            }

        }

        //当被中断后打印交易终止


# 总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!如果你需要这份完整版的**面试真题笔记**,只需你多多**支持**我这篇文章。

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**

你技术的扫盲,面试后的复盘总结效果是极好的!如果你需要这份完整版的**面试真题笔记**,只需你多多**支持**我这篇文章。

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**

![](https://www.www.zyiz.net/i/ll/?i=img_convert/88f9e118b966487139ca61fa52469025.png)
这篇关于2021我的Java路要怎么走,【线程】(2)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!