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)对象的常用方法总结

