Java中实现线程的三种方式及对比_动力节点Java学院整理

发布时间 - 2026-01-11 01:17:11    点击率:

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<Integer> 
{ 
  public static void main(String[] args) 
  { 
    CallableThreadTest ctt = new CallableThreadTest(); 
    FutureTask<Integer> 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类,所以不能再继承其他父类。

以上所述是小编给大家介绍的Java中实现线程的三种方式及对比_动力节点Java学院整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# java实现线程的方式  # java实现多线程的两种方式继承Thread类和实现Runnable接口的方法  # 总结Java中线程的状态及多线程的实现方式  # Java 实现多线程的几种方式汇总  # Java多线程的实现方式比较(两种方式比较)  # 详解三种java实现多线程的方式  # java基本教程之常用的实现多线程的两种方式 java多线程教程  # java 实现线程同步的方式有哪些  # 返回值  # 重写  # 方法来  # 多个  # 子类  # 三种  # 小编  # 多线程  # 还可以  # 在此  # 较好  # 给大家  # 在这种  # 装了  # 才是真正  # 能再  # 所述  # 给我留言  # 感谢大家  # 面向对象 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: WordPress 子目录安装中正确处理脚本路径的完整指南  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  想要更高端的建设网站,这些原则一定要坚持!  Laravel怎么判断请求类型_Laravel Request isMethod用法  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  太平洋网站制作公司,网络用语太平洋是什么意思?  PHP 500报错的快速解决方法  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel怎么在Controller之外的地方验证数据  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  如何获取免费开源的自助建站系统源码?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  java ZXing生成二维码及条码实例分享  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Internet Explorer官网直接进入 IE浏览器在线体验版网址  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  Laravel storage目录权限问题_Laravel文件写入权限设置  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  深圳网站制作的公司有哪些,dido官方网站?  linux top下的 minerd 木马清除方法  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  高端建站如何打造兼具美学与转化的品牌官网?  网页设计与网站制作内容,怎样注册网站?  如何快速查询网站的真实建站时间?  android nfc常用标签读取总结  高防服务器租用指南:配置选择与快速部署攻略  网站制作企业,网站的banner和导航栏是指什么?  Linux网络带宽限制_tc配置实践解析【教程】  如何快速使用云服务器搭建个人网站?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Laravel如何使用Sanctum进行API认证?(SPA实战)  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  如何快速生成凡客建站的专业级图册?  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  javascript中数组(Array)对象和字符串(String)对象的常用方法总结