JAVA多线程基础篇 2、如何创建线程

【Java篇】多线程详解 Java系统在语言层次上对多线程直接提供支持,多线程的主要目的是将一个程序中的各个程序段并发化,在在通常情况下,Java程序各部分是按顺序一次执行的,由于某种原因,需要将这些按顺序执行的程序段转化为并发执行,每个程序段在逻辑上是相互完整的代码段。实际上,在单处理器上,同一时刻只能执行一个代码,但是在同一时间段内,这些代码交替执行,所谓的“微观串行,宏观并行”。... 阅读详情

孔乙己蘸着酒,在桌上了写下五种创建线程的方法。

1. 继承自Thread类

  • 不足:java只允许单继承,一旦继承了Thread类就无法再继承其他类了。
public class ExThreads extends Thread {
    @Override
    public void run() {
        System.out.println("我是t1线程");
    }

    public static void main(String[] args) {
        Thread t1 = new ExThreads();
        t1.start();
    }
}

2. 实现Runnable接口

Thread类的构造方法允许传入一个对象,该对象必须实现Runnable接口。
这其实是一个典型的设计模式:静态代理。Thread类在执行的时候,实际上调用的就是这个对象的run方法。
这让我想起一部电影《师父》,咏春拳要在天津开武馆,需要收一个天津本地人为弟子,让他代替师父去踢馆。

public class ImpRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("我是t1线程");
    }

    public static void main(String[] args) {
        Thread t1 = new Thread(new ImpRunnable());
        t1.start();
    }
}

3. 实现Runnable接口(二)

借助于lambda表达式,简化。

public class ImpRunnable2 {

    public static void main(String[] args) {
        Thread t1 = new Thread(()->{
            System.out.println("我是t1线程");
        });
        t1.start();
    }
}

4. 实现Callable接口

由于java线程运行是void类型,没有返回值。后来增加了Callable接口,可以返回一个泛型返回值。

public class FutureCallableThread implements Callable<String> {

    @Override
    public String call() throws Exception {
        return LocalDateTime.now().toString();
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future<String> future = executorService.submit(new FutureCallableThread());
        //此时使用线程池提交任务后,future.get()方法是阻塞的,会等待call()完成返回。
        String str = future.get();
        System.out.println(str);
        executorService.shutdown();
    }
}

5. 实现Callable接口(二)

FutureTask实现了Runnable接口,因此用他能构建线程类。同时,他也继承了Future接口,可以返回future。

public class FutureTaskThread implements Callable<String> {

    @Override
    public String call() throws Exception {
        return LocalDateTime.now().toString();
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //先包住一层
        FutureTask<String> task = new FutureTask(new FutureCallableThread());
        //再包住一层
        Thread t1 = new Thread(task);
        t1.start();
        System.out.println(task.get());
    }
}

6. 借助于线程池

其本质还是和前面几种是一样的。

public class UsingExecutors {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("我是t1线程");
            }
        });
        executorService.shutdown();
    }
}

总结

线程创建方式很多,其核心还是Runnable接口和Thread类。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

您的支持是对我最大的鼓励。

Java零基础之多线程篇:线程的多种创建方式 众所周知,多线程是现代计算机应用程序设计中的重要概念之一,尤其是在项目开发中,经常有场景会被使用到。其实它非常容易理解,它允许程序同时执行多个任务,从而提高了系统的资源利用率和响应速度。在本文中,我们将深入研究多线程的概念、本质、作用以及多种创建方式,并通过具体的Java代码测试用例来加深对多线程的理解。本文通过对多线程的概念进行介绍,我会解释多线程在现代计算机应用程序中的作用和优势。然后,我们比较了使用Runnable接口和Thread类来创建线程的两种方式,并分析了它们之间的区别。 阅读详情

相关推荐

深入Java多线程:基础篇,你必须掌握!| 多线程篇(一)

🏆本文收录于「Java进阶实战」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1607

Java高级编程——多线程(基本概念+线程的创建及应用)

目录1、基本概念:程序、进程、线程1.1程序(program)1.2进程(process)1.3线程(thread)1.4并行与并发并行并发1.5使用多线程的优点1.6多线程的应用场景2、线程的创建和应用(重点)2.1java.lang.Thread2.1.1通过继承Thread创建线程2.1.2创建过程中的两个问题2.1.2.1问题一:不能直接调用run()方法来执行线程2.1.2.2 问题二:不能对同一线程执行两次start()2.1.3 创建Thread的匿名子类2.1.4Thread的常用方法se

ou_yang_mu_ling的博客 1220

从零构建XVC协议栈:FPGA+W5300的跨界调试架构实战

本文详细介绍了如何从零构建XVC协议栈,通过FPGA与W5300以太网控制器的创新组合实现跨界调试架构。重点解析了JTAG时序逆向、TCP/IP协议栈集成与XVC协议实现,提供了硬件设计优化和性能加速技术,为嵌入式开发者和FPGA工程师提供实用的远程调试解决方案。

raspberrypi5的博客 247

Java多线程编程——线程创建

Java中的线程有三种创建方式:继承Thread类、实现Runnable接口和实现Callable接口。下面我们一一进行介绍。 一、继承Thread类 使用该方法创建线程有如下三步: 1. 自定义线程类继承Thread类; 2. 重写该类中的run()方法,编写线程执行体; 3. 创建线程对象,调用start()方法启动线程。 例如,我们创建3个线程,分别去寻找指定区间内的素数。 public class Main { public static void main(Stri

荔枝的FM 629

Ultralytics YOLO模块自定义与替换实战技巧

本文详细介绍了在Ultralytics YOLO框架中进行模块自定义与替换的实战技巧。通过从零开始添加全新模块(如注意力模块)到进阶替换现有模块(如增强版卷积),并涵盖模块注册、YAML配置、模型融合及ONNX导出等关键步骤,帮助开发者深度定制YOLO模型,以应对复杂检测任务与部署需求。

numpy6sculptor的博客 930

从0开始学GEE python——Google Earth Engine (GEE) 和 geemap 库来获取 Sentinel-2 卫星影像,并将其可视化

这段代码的目的是从 Sentinel-2 卫星影像中获取特定地点的影像,并将其可视化在地图上。通过设置合适的波段和可视化参数,用户可以清晰地查看该地区的卫星影像。

此星光明博客 1167

Java多线程——线程的创建

文章目录概述线程的创建方式继承Thread类实现Runnable接口实现 Callable 接口线程池 概述 程序:为完成特定任务,用语言编写的一组指令的集合。即一段静态的代码。 进程:是程序的一次执行过程,或者正在运行的一个程序。是一个动态的过程,有它自身的产生、存在和消亡的过程。 线程:进程可进一步细化为线程,是一个程序内部的一条执行路径。 1)若一个进程同一时间并行执行多个线程。就是支持多线程的 2)线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器,线程切换的开销小 3)一个进程中的多个

qq_61897054的博客 600

从‘炼丹’到‘讲理’:物理信息神经网络(PINN)的硬约束 vs 软约束,我该选哪个?

本文深入探讨了物理信息神经网络(PINN)中硬约束与软约束的选择策略,帮助研究者在深度学习中有效融入物理先验知识。通过对比两种约束方法的实现复杂度、数据效率和计算性能,提供了针对材料科学和流体动力学等领域的实用决策指南,并介绍了自适应约束和混合约束等前沿技术。

weixin_42535703的博客 527

Java多线程之四种方法创建线程

创建多线程常用的方法有四种,继承Thread、实现Runnable接口、使用Callable和FutureTask和线程池

liu320yj的博客 5052

AI编程实战:用Spec Coding与Codex半小时重构全栈项目

这次我们来看一个能显著提升全栈开发效率的实战方法:利用 AI 编程工具 Codex 和 Spec Coding 工作流,将原本需要数周甚至一个月的全栈项目重构工期,压缩到半小时级别。这不是概念探讨,而是基于现有工具链的、可立即上手的工程实践。 对于前端开发者或全栈工程师而言,面对老旧项目重构、技术栈升级或从零搭建新项目时,最大的痛点往往是重复性、模式化的代码编写工作。手动编写 CRUD 接口、页面组件、状态管理和联调测试,耗时费力且容易出错。而 AI 辅助编程的核心价值,正是在于将开发者从这些“体力活”中解

weixin_33525298的博客 290

Win10下YOLOv8环境搭建避坑指南:从CUDA 11.6到cuDNN配置全流程

本文详细介绍了在Windows 10系统下搭建YOLOv8环境的完整流程,包括CUDA 11.6和cuDNN的配置步骤,以及常见问题的解决方案。通过硬件准备、软件安装、环境验证和性能优化等环节,帮助开发者高效完成YOLOv8环境配置,提升目标检测项目的开发效率。

defi6farmer的博客 224

Java 多线程 线程创建

Thread类是java.lang包下的一个线程类,用来实现Java多线程。通过继承Thread类的方式来实现多线程非常简单,主要步骤如下: (1)创建一个Thread线程类的子类(子线程),同时重写Thread类的run()方法; (2)创建该子类的实例对象,并通过调用start()方法启动线程。 接下来通过一个案例来演示如何通过继承Thread类的方式来实现多线程,如文件1所示。 文件1 Example01.java 1// 1、定义一个继承Thread线程类的子类 2 class

m0_62520968的博客 644

在claude code desktop中安装pdf处理skill的实战教程

本文介绍了在Claude Code Desktop中安装PDF处理Skill的详细教程。针对国内用户使用第三方API时无法直接调用官方插件的问题,提供了完整的解决方案。教程从下载Anthropic官方Skills源码开始,逐步演示了如何将PDF处理模块打包、上传至Claude Code Desktop,并最终成功加载使用。整个过程采用全流程拆解方式,确保新手也能快速上手。通过本文,读者可以掌握在非官方环境下扩展Claude Code功能的方法,从而提升工作效率

weixin_43178406的博客 9万+

Java多线程的创建

ThreadTest1类。ThreadTest2类。ThreadTest3类。MyRunnable类。MyCallable类。

SU_mu147的博客 2162

睿抗机器人魔力元宝在完成任务过程中如何使机械臂先到达白色盒子上方而不是先到达工作台?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1378

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

『Java多线程』基础之基础

Java基础篇~多线程 线程概念 程序(Program) ​ 程序是指令、数据及其组织形式的描述,也就是存储在磁盘或者其他存储设备中含有指令和数据的文件,是一段静态代码 进程(Process) ​ 进程是受操作系统管理的基本单元,是程序的一次动态执行过程,是系统进行资源分配和调度的基本单位,它对应了从代码加载、执行到执行完毕的整个过程,即进程的创建、运行到消亡的过程。从某种程度上来说,进程是正在运行程序的实例,是一个动态概念 多任务(Multi Task) ​ 在一

像写诗一样优雅地写代码~ 7642

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JAVA多线程基础

JAVA多线程基础 1.什么是并发原理? 多线程:多线程允许我们“同时”执行多段代码。 线程是并发运行的,线程调度会统一规划CPU时间,将CPU的时间划分为若干片段,然后尽可能的均匀分配给所要并发运行的线程,每个线程在获取CPU时间片段后CPU就会运行它的任务,当时间片段用完后,Cpu会离开并执行获取到CPu时间片的线程,所以,所有线程并非真正的“同时”运行着代码,而是走走停停,这种微观上走走停停,在宏观上感觉是同步进行的现象称为“并发运行”。 2.创建线程Thread 1. 方式一:继承Thread并重写

weixin_47600732的博客 4277

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java之多线程创建

Java多线程归纳前言传统的线程创建继承Thread类实现Runnable接口两者的共同点两者差别JDK 1.5开始出现的线程创建 前言 进程是资源分配的最小单位,而线程是执行任务的最小的单位。进程里的线程可以共享该进程拥有的资源,而进程之间不可以,进程奔溃了,在保护模式下,不会影响其他进程,而线程一旦出问题了,该进程也要GG思密达。总而言之,创建一个线程比创建一个进程要省事得多儿,这也是当今为...

legendaryhaha的博客 3819

【多线程初阶篇 ²】创建线程的方式

本篇主要介绍了Java中创建线程都有哪些写法

qq_73017178的博客 1193

Java Web基础篇之Java多线程

1、多线程与进程 1.1、是什么? 线程有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元,进程与线程区别如下:一个进程至少有一个线程.。 1.2、扩展: 进程与线程区别,线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每...

聚沙成塔 5777

java基础(五)多线程篇

可重入锁是指:同一个线程可以多次获取自己已经持有的锁,而不会被自己阻塞。你进了自己家大门(获取了锁),可以随意进出家里的各个房间(再次获取同一把锁),不需要出了大门再重新进。和都是可重入锁。内部维护一个计数器(hold count第一次获取锁,计数器=1。同一线程再次获取,计数器+1。释放锁时计数器-1。只有当计数器减到0时,锁才真正释放,其他线程才能获取。你已经完成了Java多线程的入门之旅。从基础概念到线程创建、状态管理、通信协作,再到线程安全、锁机制、线程池和JUC工具,我们一路打怪升级过来。

2301_79028279的博客 1560

【Java 基础篇】Java多线程编程详解

本文详细介绍了Java多线程编程的概念、原理和常用技术。多线程编程可以提高程序的性能和响应能力,但也需要注意线程安全和线程同步的问题。在实际开发中,合理地使用多线程可以充分发挥多核处理器的优势,提高程序的并发能力和执行效率。同时,需要注意避免多线程之间的竞争条件和数据一致性问题,保证线程的安全性和正确性。希望本文对你理解和应用Java多线程编程有所帮助!

繁依Fanyi的博客 3112

Java多线程编程-基础篇

多线程在实际的应用程序中法非常常用,例如我们在12306买票就是一个多线程的过程,每个准备抢票的人的手机上都会生成一个抢票线程,当全国几亿人同时访问这个软件,它如何能不出错,保证系统运行正常呢,这里面涉及的并发并行和多线程知识非常之多。希望大家都要学好这一块的知识,学习在路上,加油!

weixin_74141526的博客 1600

【Java】多线程(篇一) : 通过Thread类创建线程的方法

【Java】多线程:通过Thread类创建线程的方法 1. 创建一个类, 继承Thread, 重写run方法 用线程来写一个简单的 hello word: 多线程的无限循环 以及调试器 调试器 2. 创建一个类, 实现Runnable , 重写 run 方法

mmmocen的博客 1248

Java多线程开发——基础篇

多线程环境下,对共享资源的访问不会导致数据出错。因此和单线程执行相同的操作,结果相同多个线程相互等待对方释放资源,导致无法继续执行4.25.线程池的掌握。

zhoujun798的博客 947

【Java】Java多线程基础

复习

Answer的博客 832
上一篇: JAVA多线程基础篇 3、如何优雅结束一个线程
下一篇: JAVA多线程基础篇 4、可见性、有序性与Volatile
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值