java创建线程的三种方式及其对比

java创建线程的三种方式及其对比Java 中创建线程主要有三种方式 一 继承 Thread 类创建线程类 1 定义 Thread 类的子类 并重写该类的 run 方法 该 run 方法的方法体就代表了线程要完成的任务 因此把 run 方法称为执行体 2 创建 Thread 子类的实例 即创建了线程对象 3 调用线程对象的 start 方法来启动该线程 packagecom thread publicclassF

Java中创建线程主要有三种方式:

一、继承Thread类创建线程类

(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。

(2)创建Thread子类的实例,即创建了线程对象。

(3)调用线程对象的start()方法来启动该线程。

package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方法体就是现场执行体 public void run() { for(;i<100;i++){ System.out.println(getName()+" "+i); } } public static void main(String[] args) { for(int i = 0;i< 100;i++) { System.out.println(Thread.currentThread().getName()+" : "+i); if(i==20) { new FirstThreadTest().start(); new FirstThreadTest().start(); } } } } 

上述代码中Thread.currentThread()方法返回当前正在执行的线程对象。GetName()方法返回调用该方法的线程的名字。

二、通过Runnable接口创建线程类

(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

(2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

(3)调用线程对象的start()方法来启动该线程。

示例代码为:

package com.thread; public class RunnableThreadTest implements Runnable { private int i; public void run() { for(i = 0;i <100;i++) { System.out.println(Thread.currentThread().getName()+" "+i); } } public static void main(String[] args) { for(int i = 0;i < 100;i++) { System.out.println(Thread.currentThread().getName()+" "+i); if(i==20) { RunnableThreadTest rtt = new RunnableThreadTest(); new Thread(rtt,"新线程1").start(); new Thread(rtt,"新线程2").start(); } } } } 

三、通过Callable和Future创建线程

(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

(2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。

(4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

实例代码:

package com.thread; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class CallableThreadTest implements Callable 
    
      { public static void main(String[] args) { CallableThreadTest ctt = new CallableThreadTest(); FutureTask 
     
       ft = new FutureTask<>(ctt); for(int i = 0;i < 100;i++) { System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i); if(i==20) { new Thread(ft,"有返回值的线程").start(); } } try { System.out.println("子线程的返回值:"+ft.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } @Override public Integer call() throws Exception { int i = 0; for(;i<100;i++) { System.out.println(Thread.currentThread().getName()+" "+i); } return i; } } 
      
    

二、创建线程的三种方式的对比

采用实现Runnable、Callable接口的方式创见多线程时,优势是:

线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。

在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。

劣势是:

编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。

使用继承Thread类的方式创建多线程时优势是:

编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。

劣势是:

线程类已经继承了Thread类,所以不能再继承其他父类。







版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/175788.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午11:25
下一篇 2026年3月26日 下午11:26


相关推荐

  • Pycharm专业版安装详细教程!

    Pycharm专业版安装详细教程!Pycharm 官网地址 下载 https link zhihu com target https 3A www jetbrains com pycharm download other html 有各种不同版本的 Pycharm 供下载 本文选择 Pycharm 专业版下载 建议下载 2020 1 5 版本 安装教程下载完成之后 就按照步骤开始安装了 点击 Next 我选择安装在 F 盘 因为 C 盘太占用空间了 会比较卡 点击 Next 一定要选着添加到环境变量中 不然后面还要手动配置环境变量 比较麻烦

    2026年3月18日
    2
  • 欧拉角以及方向余弦

    欧拉角以及方向余弦目前 描述两个坐标系之间关系的常用方法主要有欧拉角法 方向余弦矩阵法和四元数法 因此要弄懂这三种方法的定义及关系 我们必须先从坐标系转化开始了解 下面以四旋翼为例 定义两个坐标系 导航坐标系 参考坐标系 n 选取东北天右手直角坐标系作为导航坐标系 n 载体坐标系 机体坐标系 b 选取右手直角坐标系定义 四轴向右为 X 正方向 向前为 Y 轴正方向 向上为 Z 轴正方向 nbsp 欧拉角 欧拉角是一种常用的描述方位

    2026年3月18日
    2
  • AI、游戏双驱动,腾讯「赚麻了」

    AI、游戏双驱动,腾讯「赚麻了」

    2026年3月12日
    2
  • Apache服务器配置多个站点

    Apache服务器配置多个站点Apache服务器配置多个站点

    2022年4月23日
    46
  • 金山词霸2007升级v10.0.0.4

    金山词霸2007升级v10.0.0.4词霸2007不但产品功能更加完善,而且在用户的体验方面也做了很多改进。首先,词霸07收录了150余本权威词典,70余个专业词库,同时支持28种常备资料线实时更新,让您随时拥有奥运知识、常用工具(货币单位等)等最新的资料;其次全面支持简体中文、英文、日文查词功能,满足更多用户需求;值得一提的是,词霸07收录了与朗文、牛津、韦氏齐名四大词典的《美国传统词典》最新版,英汉、英英双解,包含96000余词条

    2022年7月15日
    20
  • linux系统的7种banding方式「建议收藏」

    linux系统的7种banding方式「建议收藏」深度分析Linux下双网卡绑定七种模式2012年05月24日Linux平台评论数22浏览:8850Views今天分享的是linux操作系统下双网卡绑定有哪七种模式,分别是如何工作的。现在一般的企业都会使用双网卡接入,这样既能添加网络带宽,同时又能做相应的冗余,可以说是好处多多。而一般企业都会使用linux操作系统下自带的网卡绑定模式,当然现在网卡产商也会出一些针对w…

    2022年10月13日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号