Java中实现多线程的几种方式

大模型推理常见采样策略:Top-k, Top-p, Temperature, Beam Search 大模型推理采样策略,举例通俗易懂汇总介绍 阅读详情

在 Java 中,可以通过多种方式实现多线程编程,常见的有以下几种方式:

1. 继承 Thread 类

示例代码:
class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Thread is running");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}
优点:
  • 简单直接,通过继承 Thread 类,重写 run 方法即可创建线程。
  • 适合实现轻量级的、多线程的任务。
缺点:
  • Java 不支持多继承,如果继承 Thread,就不能继承其他类,灵活性较差。
  • 扩展性较弱,难以复用线程逻辑。

2. 实现 Runnable 接口

示例代码:
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Runnable is running");
    }
}

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }
}
优点:
  • 可以实现多继承,类可以同时继承其他类和实现 Runnable 接口。
  • 线程任务可以与线程控制分离,逻辑更清晰,适合多次复用。
缺点:
  • 需要通过 Thread 类显式创建线程对象。

3. 使用 Callable 接口和 Future 接口

Callable 接口类似于 Runnable,但它可以返回结果并抛出异常。

示例代码:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "Callable result";
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
        Thread thread = new Thread(futureTask);
        thread.start();
        
        // 等待任务完成并获取结果
        String result = futureTask.get();
        System.out.println(result);
    }
}
优点:
  • 可以返回结果并抛出异常,适合有返回值的任务。
  • 与 FutureTask 配合,可以实现线程间的结果传递。
缺点:
  • 相比 Runnable,稍微复杂一点,需要通过 FutureTask 等类来管理结果。

4. 使用线程池(ExecutorService)

示例代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2);

        executor.execute(() -> {
            System.out.println("Task 1 running");
        });

        executor.execute(() -> {
            System.out.println("Task 2 running");
        });

        executor.shutdown();
    }
}
优点:
  • 提高资源利用率,减少线程创建和销毁的开销。
  • 提供线程复用机制,适合处理大量并发任务。
  • 通过线程池可以灵活控制线程数量。
缺点:
  • 相对复杂,需要理解 ExecutorService 和线程池的管理。
  • 需要手动管理线程池的关闭,否则可能导致内存泄漏。

5. 使用 ForkJoinPool 和 ForkJoinTask

ForkJoinPool 适用于并行任务,将任务分成多个子任务并行执行,再将结果合并。

示例代码:
import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;

class MyRecursiveTask extends RecursiveTask<Integer> {
    private final int workload;

    public MyRecursiveTask(int workload) {
        this.workload = workload;
    }

    @Override
    protected Integer compute() {
        if (workload > 1) {
            MyRecursiveTask task1 = new MyRecursiveTask(workload / 2);
            MyRecursiveTask task2 = new MyRecursiveTask(workload / 2);
            task1.fork();
            return task2.compute() + task1.join();
        } else {
            return workload;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        MyRecursiveTask task = new MyRecursiveTask(100);
        int result = forkJoinPool.invoke(task);
        System.out.println("Result: " + result);
    }
}
优点:
  • 提供高效的并行执行,适合任务拆分的场景(如大规模计算)。
  • 内置负载均衡机制,能够充分利用多核 CPU。
缺点:
  • 对于简单任务,使用 ForkJoinPool 会引入额外的复杂性和开销。
  • 不适合 I/O 密集型任务,适合 CPU 密集型任务。

结论

  • 继承 Thread:简单,但不灵活,限制较多。
  • 实现 Runnable:推荐使用,灵活性高,任务与线程分离。
  • 使用 Callable 和 Future:适合需要返回值的多线程任务。
  • 线程池:适合大量并发任务,资源管理更高效。
  • ForkJoinPool:适合计算密集型任务的并行处理。
从零到一:高通Memory QMVS测试环境搭建的避坑指南 本文详细介绍了高通Memory QMVS测试环境搭建的全流程避坑指南,涵盖硬件选择、软件配置、QMVS核心组件安装及测试执行技巧。重点解析了adb工具配置、QPST日志抓取等关键步骤,帮助工程师高效搭建稳定测试环境,避免常见兼容性和稳定性问题。 阅读详情

相关推荐

VMware桥接模式实战:用手机热点给Linux虚拟机共享网络(附WiFi适配技巧)

本文详细介绍了在移动办公场景下,如何为VMware中的Linux虚拟机配置桥接模式,以通过手机热点共享网络。文章深入解析了桥接模式在无线环境下的工作原理,提供了从主机端准备、VMware设置到Linux虚拟机内部配置的完整实战步骤,并针对手机热点的特殊性,分享了MTU优化、DNS配置及常见网络问题的诊断与解决方案,帮助用户实现稳定高效的移动虚拟化办公。

2y3u4i5o6p的博客 1196

java 多线程实现的四种方式

ScheduledExecutorService newScheduledThreadPool() : 创建固定大小的线程,可以延迟或定时的执行任务。ExecutorService newCachedThreadPool() : 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量。ExecutorService newSingleThreadExecutor() : 创建单个线程池。|–ExecutorService 子接口: 线程池的主要接口。工具类 : Executors。

李白 3175

从Excel到Power Pivot:构建你的第一个商业智能分析模型

本文详细介绍了如何从Excel升级到Power Pivot,构建你的第一个商业智能分析模型。通过激活Power Pivot功能、导入数据、建立表关系、创建智能度量值以及打造交互式仪表盘,帮助用户高效处理百万行级别的数据,实现数据自动关联和动态分析,大幅提升商业决策效率。

weixin_30629653的博客 256

Java多线程实现的四种方式

Java多线程实现的方式有四种 1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target 3.通过Callable和FutureTask创建线程 4.通过线程池创建线程 .........

Infor_learning的博客 4370

Jetson Orin NX上CAN总线调试全攻略:从硬件焊接到开机自启动(附常见问题解决方案)

本文详细介绍了在NVIDIA Jetson Orin NX开发板上进行CAN总线调试的全过程,包括硬件焊接、驱动配置、通信测试和开机自启动设置。针对常见问题如信号接反、波特率设置等提供了实用解决方案,帮助开发者快速实现稳定的CAN总线通信。

c2d3e4f的博客 1076

VSCode+PlatformIO新建工程卡成狗?3步提速大法实测有效(附镜像源配置)

针对VSCode+PlatformIO新建工程时因依赖下载缓慢导致的加载慢问题,本文提供了三步核心提速方案。通过配置Python环境变量、修改PlatformIO插件设置以使用国内镜像源,并优化pip配置文件,实测可大幅缩短工程创建时间,有效解决创建工程卡顿的痛点。

delta的博客 711

JAVA多线程实现的四种方式

其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。

qq_21305943的专栏 1278

Ardupilot无人船(车)mavros自主控制

rover 4.4。

超维空间科技的博客 3229

多线程开发实战:Java实现多线程四种方式及相关方法原理

本文带大家了解Java实现多线程的四种方法以及实现多线程的重要注意事项和难点!

陈橘又青的博客 3万+

【控制模块算法】控制理论的进修之路

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、(经典)自动控制理论【本科阶段】二、现代控制理论【本科阶段】三、最优控制理论【硕士阶段】总结 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对对控制理论的理解做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、(经典)自动控制理论【本科阶段】 一般控制工程、自动化相关的考研专业课就是自动

qq_35635374的博客 1448

机器学习实战7-基于机器学习算法预测相亲成功率

大家好,我是微学AI,今天给大家介绍一下机器学习实战7-基于机器学习算法预测相亲成功率,随着社会的发展,大家都忙于事业,对自己的终身大事就耽搁了,相亲是一种传统的寻找伴侣的方式,随着时代的发展,相亲的方式也在不断地改变。在这个过程中,了解相亲双方的信息以及预测相亲是否成功变得越来越重要。本文将介绍如何使用随机森林算法对相亲成功进行预测,通过分析男女双方的房子、车子、长相、家庭条件、父母情况、生活习惯、学历、性格、兴趣等因素,来预测相亲是否成功。

微学AI的博客 3033

Java中的线程(创建多线程的三种方法)

如果线程执行完毕后有一些数据需要返回,他们重写的run方法均不能直接返回结果。另一种写法:匿名内部类写法。匿名内部类的简化方法。

Mafia的博客 1088

将Windbg附加到软件进程上排查异常闪退的问题

使用Windbg和Process Explorer排查因为内存泄漏导致的软件异常闪退问题。

dvlinker的技术专栏 1万+

java多线程的几种实现方式

/比第一种多出这步(new一个Thread类,并将任务类r传进去)1.定义一个Mythread类并继承Thread类,重写Thread的run方法,方法内部写具体的业务代码。//第二种实现runable接口,重写Runable接口run方法。// 多线程的第一种启动方式继承Thread,成为子类。2.调用Mythread类。1.定义MyRun类。

qq_36633637的博客 600

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JAVA多线程的几种实现方式

JAVA多线程的几种实现方式

xiaowangbadan0_0的博客 668

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【多线程】Java中多线程的几种实现方式

多线程(multithreading)是指在一个程序中同时执行多个不同的线程(thread),每个线程都是程序的一部分,是独立的执行路径。相比于单线程程序,多线程程序可以更充分地利用计算机的多核心或多处理器资源,提高程序的运行效率和用户体验。在多线程编程中需要注意线程同步、锁、死锁等问题。

小筱在线博客 2331

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java多线程实现的几种方式

1.通过继承Thread类实现 public class MyThread extends Thread{ public void run(){ System.out.println(&amp;amp;quot;New Thread : &amp;amp;quot;+Thread.currentThread().getName()); } public static void main (String []a...

Medlen 2943

java 实现多线程几种方式

java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。 其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1、继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一

花开半夏 · 流年似水 2439

Java多线程实现的几种方式

Java多线程实现的几种方式 1.继承thread类 2.实现Runnable接口 3.通过Callable和FutureTask创建线程 4.使用线程池方式—Callable接口 5.使用线程池方式--Runnable接口 1.继承thread类 继承thread类,重写run()方法,start()启动线程 public class TestThread extends Thread{ //创建线程的方式1:继承thread类,重写run方法,start()启动..

weixin_44197026的博客 760

java实现多线程的几种方式

Java中的多线程是通过java.lang.Thread类来实现的,该类下定义了一系列关于线程的操作。关于实现多线程有多种方式,这里列举常用的四种方式: 1:继承Thread类 2:实现Runnable接口 3:FutureTask、实现Callable接口 4:ExecutorService、实现Callable接口、Future 其中前两种方式线程执行完后都没有返回值,后两种是带返回...

qq_25321335的博客 506

JAVA多线程有哪几种实现方式呢?

Java中多线程的实现方式分享

qq_25073223的博客 1585

java线程几种实现_java多线程的几种实现方式

java多线程的几种实现方式1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target3.通过Callable和FutureTask创建线程4.通过线程池创建线程 (上一篇已经讲过了)前面两种可以归结为一类:无返回值,原因很简单,通过重写run方法,run方式的返回值是void,所以没有办法...

weixin_42640676的博客 178

Java 实现多线程的几种方式-超详细(干货)

订阅 TheTutorials/Java 学习更多 Java 相关的知识 Java 多线程 Java 本身提供了对多线程的支持,多线程允许并发的执行程序的多个部分,最大成程度的利用 CPU,一个进程是由多个线程所组成,因此线程可以看作轻量级进程。 Java 实现多线程 继承 Thread public static void main(String[] args) { /* 创建线程 */ MyThread firstThread = new MyThread("firstThre.

shellhub的博客 276

java线程几种实现_Java 实现多线程的几种方式汇总

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。我们先来看段示例代码import java.util.concurrent.Callable;import java.util.concurrent.FutureT...

weixin_36244383的博客 213
上一篇: k8s 1.23 如何实现pod自动扩容伸缩
下一篇: CompletableFuture详细用法
yymagicer
博客等级 码龄13年 1425粉丝 180原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

yymagicer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值