iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中如何启动线程start和run
  • 670
分享到

Java中如何启动线程start和run

javastartrun 2023-05-30 22:05:14 670人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关Java中如何启动线程start和run,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、区别Java中启动线程有两种方法,继承Thread类和实现Runnable接口,由于J

这篇文章将为大家详细讲解有关Java中如何启动线程start和run,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、区别

Java中启动线程有两种方法,继承Thread类和实现Runnable接口,由于Java无法实现多重继承,所以一般通过实现Runnable接口来创建线程。但是无论哪种方法都可以通过start()和run()方法来启动线程,下面就来介绍一下他们的区别。

start方法:

通过该方法启动线程的同时也创建了一个线程,真正实现了多线程。无需等待run()方法中的代码执行完毕,就可以接着执行下面的代码。此时start()的这个线程处于就绪状态,当得到CPU的时间片后就会执行其中的run()方法。这个run()方法包含了要执行的这个线程的内容,run()方法运行结束,此线程也就终止了。

run方法:

通过run方法启动线程其实就是调用一个类中的方法,当作普通的方法的方式调用。并没有创建一个线程,程序中依旧只有一个主线程,必须等到run()方法里面的代码执行完毕,才会继续执行下面的代码,这样就没有达到写线程的目的。

下面我们通过一个很经典的题目来理解一下:

public class Test {  public static void main(String[] args) {    Thread t = new Thread(){      public void run() {        pong();      }    };    t.run();    System.out.println("ping");  }  static void pong() {    System.out.println("pong");  }}

代码如图所示,那么运行程序,输出的应该是什么呢?没错,输出的是”pong ping”。因为t.run()实际上就是等待执行new Thread里面的run()方法调用pong()完毕后,再继续打印”ping”。它不是真正的线程。

而如果我们将t.run();修改为t.start();那么,结果很明显就是”ping pong”,因为当执行到此处,创建了一个新的线程t并处于就绪状态,代码继续执行,打印出”ping”。此时,执行完毕。线程t得到CPU的时间片,开始执行,调用pong()方法打印出”pong”。

如果感兴趣,还可以多加几条语句自己看看效果。

二、源码

那么他们本质上的区别在哪里,我们来看一下源码

  public synchronized void start() {        if (threadStatus != 0)      throw new IllegalThreadStateException();        group.add(this);    boolean started = false;    try {      start0();      started = true;    } finally {      try {        if (!started) {          group.threadStartFailed(this);        }      } catch (Throwable ignore) {              }    }  }  private native void start0();

可以看到,当一个线程启动的时候,它的状态(threadStatus)被设置为0,如果不为0,则抛出IllegalThreadStateException异常。正常的话,将该线程加入线程组,最后尝试调用start0方法,而start0方法是私有的native方法(Native Method是一个java调用非java代码的接口)。

我猜测这里是用C实现的,看来调用系统底层还是要通过C语言。这也就是为什么start()方法可以实现多线程。而调用run()方法,其实只是调用runnable里面自己实现的run()方法。

我们再看看Thread里run()的源码:

@Override  public void run() {    if (target != null) {      target.run();    }  }

如果target不为空,则调用target的run()方法,那么target是什么:

  private Runnable target;

其实就是一个Runnable接口,正如上面代码中new Thread的部分,其实我们就是在实现它的run()方法。所以如果直接调用run,就和一个普通的方法没什么区别,是不会创建新的线程的,因为压根就没执行start0方法。

三、实现

前面说了,继承Thread类和实现Runnable接口都可以定义一个线程,那么他们又有什么区别呢?
在《Java核心技术卷1 第9版》第627页提到。可以通过一下代码构建Thread的子类定义一个线程:

class MyThread extends Thread {  public void run() {    //do Something  }}

然后,实例化一个对象,调用其start方法。不过这个方法不推荐。应该减少需要并行运行的任务数量。如果任务很多,要为每个任务创建一个独立的线程所付出的代价太多,当然可以用线程池来解决。

实现Runnable接口所具有的优势:

避免Java单继承的问题

适合多线程处理同一资源

代码可以被多线程共享,数据独立,很容易实现资源共享

总结一下:

start() 可以启动一个新线程,run()不能

start()不能被重复调用,run()可以

start()中的run代码可以不执行完就继续执行下面的代码,即进行了线程切换。直接调用run方法必须等待其代码全部执行完才能继续执行下面的代码。

start() 实现了多线程,run()没有实现多线程。

关于“Java中如何启动线程start和run”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Java中如何启动线程start和run

本文链接: https://www.lsjlt.com/news/221647.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中如何启动线程start和run
    这篇文章将为大家详细讲解有关Java中如何启动线程start和run,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、区别Java中启动线程有两种方法,继承Thread类和实现Runnable接口,由于J...
    99+
    2023-05-30
    java start run
  • Java线程启动为什么要用start()而不是run()?
    目录1、直接调用线程的run()方法2、调用线程的start()方法3、总结1、直接调用线程的run()方法 public class TestStart { publi...
    99+
    2024-04-02
  • Java线程中start方法如何回调run方法
    小编给大家分享一下Java线程中start方法如何回调run方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java 创建线程的方法实际上,创建线程最重要的是提...
    99+
    2023-05-30
    java start run
  • Java线程启动怎么用start()
    本篇内容介绍了“Java线程启动怎么用start()”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、直接调用线程的run()方法publi...
    99+
    2023-06-25
  • Java线程中的常见方法(start方法和run方法)
    目录start方法和run方法示例代码注意sleep方法与yield方法sleepyield线程优先级sleep的应用-防止cpu占用100%join方法有实效的等待interrup...
    99+
    2024-04-02
  • Java多线程启动为什么调用的是start()方法而不是run() 方法
    这篇文章主要讲解了“Java多线程启动为什么调用的是start()方法而不是run() 方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程启动为什么调用的是start()方法而...
    99+
    2023-06-16
  • java中start()和run()的区别有哪些
    这篇文章主要介绍了java中start()和run()的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java是什么Java是一门面向对象编程语言,可以编写桌面应用...
    99+
    2023-06-14
  • Java Thread中start()和run()的区别_动力节点Java学院整理
    start() 和 run()的区别说明start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。run()   : run()就和普通的成员方法一样,可以被重复调用。...
    99+
    2023-05-31
    thread start run
  • 面试官问如何启动Java 线程
    目录一、线程启动分析二、线程启动过程1. Thread start UML 图2. Java 层面 Thread 启动2.1 start() 方法2.2 start0() 本地方法3...
    99+
    2024-04-02
  • 怎么在java线程中使用start
    本篇文章为大家展示了怎么在java线程中使用start,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queu...
    99+
    2023-06-14
  • 怎么启动Java 线程
    这篇文章给大家分享的是有关怎么启动Java 线程的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、线程启动分析new Thread(() -> { &nbs...
    99+
    2023-06-22
  • 如何使用iisweb.vbs start启动网站
    本篇内容介绍了“如何使用iisweb.vbs start启动网站”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!应用到: Windows Se...
    99+
    2023-06-08
  • net start mysql无法启动MySQL如何解决
    今天小编给大家分享的是net start mysql无法启动MySQL如何解决,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。问题描述:在命令提示符窗...
    99+
    2024-04-02
  • java怎么使用线程池启动多线程
    在 Java 中,可以使用线程池来启动多线程。以下是使用线程池启动多线程的示例代码:首先,需要导入 `java.util.concu...
    99+
    2023-09-15
    java
  • Docker如何使用start命令启动容器
    小编给大家分享一下Docker如何使用start命令启动容器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用start命令启动...
    99+
    2024-04-02
  • 在java项目中使用线程池如何实现获取运行线程数并控制线程启动速度
    这期内容当中小编将会给大家带来有关在java项目中使用线程池如何实现获取运行线程数并控制线程启动速度,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在java里, 我们可以使用Executors.newFi...
    99+
    2023-05-31
    java 线程池 线程
  • weblogic多线程启动报错如何解决
    WebLogic多线程启动报错通常是由于配置问题或者代码问题引起的。以下是一些可能的解决方法:1. 检查WebLogic的配置文件是...
    99+
    2023-09-01
    weblogic
  • 如何中止java线程
    这篇文章主要介绍“如何中止java线程”,在日常操作中,相信很多人在如何中止java线程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何中止java线程”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!错误...
    99+
    2023-06-16
  • Java如何手动创建线程池
    目录如何手动创建线程池构造器队列饱和策略示例源码分析线程池工具类实现线程的三种方式使用ThreadPoolExecutor编写线程池工具类如何手动创建线程池 jdk提供了一个通过Th...
    99+
    2024-04-02
  • Java Web Start如何部署应用程序
    这篇文章将为大家详细讲解有关Java Web Start如何部署应用程序,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java web Start 是部署基于 JavaTM 技术的应用程序的一种新技术。它...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作