zoukankan      html  css  js  c++  java
  • 多线程

    1.Thread.start和Thread.run是什么?

    start()方法

    线程类的start()方法可以用来启动线程;该方法会在内部调用Runnable接口的run()方法,以在单独的线程中执行run()方法中指定的代码。

    start()方法启动线程执行以下任务:

    1. 它统计了一个新线程
    2. 线程从New State移动到Runnable状态。
    3. 当线程有机会执行时,它的目标run()方法将运行。

    run()方法

    线程类的run()方法是Runnable接口的一个抽象方法,由java虚拟机直接调用的,不会创建的新线程。

    2.start() vs run()

    方法的定义

    • start()方法在java.lang.Thread类中定义;
    • run()方法在java.lang.Runnable接口中定义,必须在实现类中重写。

    新线程创建

    • 当程序调用start()方法时,会创建一个新线程,然后执行run()方法。
    • 但是如果我们直接调用run()方法,则不会创建新的线程,run()方法将作为当前调用线程本身的常规方法调用执行,并且不会发生多线程。

    多次调用是否抛出异常(易错)

    • start()方法只能调用一次,不能多次调用,否则抛出java.lang.IllegalStateException.(对比:Thread.interrupt()可以多次调用,不会有异常)
    • run()方法可以进行多次调用,因为它只是一种正常的方法调用。

    调用start()代码示例

    class MyThread extends Thread {
        public void run() {
            System.out.println("
    ");
            System.out.println("当前线程的名称: " + Thread.currentThread().getName());
            System.out.println("run()方法调用");
        }
    }
    
    
    class demo {
        public static void main(String[] args) {
            MyThread t = new MyThread();
            t.start();
        }
    }
    

    输出:

    正如我们在上面的例子中所看到的,当我们调用线程类实例的start()方法时,会创建一个新的线程,默认名称为Thread-0,然后调用run()方法,并在其中执行所有内容。新创建的线程。

    调用run()代码示例

    现在,让我们尝试直接调用run()方法而不是start()方法:

    class MyThread extends Thread {
        public void run() {
            System.out.println("
    ");
            System.out.println("当前线程的名称: " + Thread.currentThread().getName());
            System.out.println("run()方法调用");
        }
    }
    
    
    class GeeksforGeeks {
        public static void main(String[] args) {
            MyThread t = new MyThread();
            t.run();
        }
    }
    

    输出:

    正如我们在上面的例子中所看到的,当我们调用MyThread类的run()方法时,没有创建新线程,并且在当前线程即主线程上执行run()方法。因此,没有发生多线程。run()方法是作为正常函数被调用。

     

    参考

    https://baijiahao.baidu.com/s?id=1624067920453033349&wfr=spider&for=pc

  • 相关阅读:
    Win7 64位 php-5.5.13+Apache 2.4.9+mysql-5.6.19 配置
    C# .NET 使用第三方类库DotNetZip解压/压缩Zip rar文件
    64位window7,php5.5.10 +IIS7 配置
    eclipse下编译openfire3.9.1源码
    asp.net 解决IE11下 From身份验证失效问题
    MySQL 数据类型 详解
    ASP.NET安全
    Microsoft Anti-Cross Site Scripting Library V4.2 下载地址
    Entityframework Core去掉外键
    VS2019发布Docker实践
  • 原文地址:https://www.cnblogs.com/frankcui/p/12434430.html
Copyright © 2011-2022 走看看