首页 > 编程语言 >Java中的多线程是如何实现的?

Java中的多线程是如何实现的?

时间:2024-03-18 22:29:51浏览次数:21  
标签:Runnable Java Thread Callable 如何 线程 run 多线程 public

​​​​​​继承Thread类:

  • 通过继承Java的Thread类并重写其run()方法,可以创建一个线程。run()方法包含了线程要执行的代码。
  • 创建Thread子类的实例,并调用其start()方法来启动线程。start()方法会导致线程开始执行,自动调用run()方法。
  • 注意:Java不支持多重继承,因此如果类已经继承了其他类,则不能通过继承Thread类来实现多线程。
public class MyThread extends Thread {  
    @Override  
    public void run() {  
        // 线程执行的代码  
    }  
  
    public static void main(String[] args) {  
        MyThread thread = new MyThread();  
        thread.start(); // 启动线程  
    }  
}

实现Runnable接口

  • 实现Runnable接口并重写其run()方法,也可以创建线程。Runnable接口只有一个方法需要实现,因此这种方式更为灵活,特别是当类已经继承了其他类时。
  • 创建Runnable实现类的实例,并将该实例作为参数传递给Thread类的构造函数,从而创建Thread对象。
  • 调用Thread对象的start()方法来启动线程。
public class MyRunnable implements Runnable {  
    @Override  
    public void run() {  
        // 线程执行的代码  
    }  
  
    public static void main(String[] args) {  
        Thread thread = new Thread(new MyRunnable());  
        thread.start(); // 启动线程  
    }  
}

实现Callable接口配合ExecutorService

  • Callable接口与Runnable接口类似,但Callable的call()方法可以返回结果,并且可以声明抛出异常。
  • 通常使用ExecutorService的submit()方法提交Callable任务,并返回一个Future对象,通过Future对象可以获取Callable执行的结果。
  • ExecutorService是一个更高级的线程工具,它提供了线程池的管理,包括线程的创建、调度、销毁等,使得线程的使用更加灵活和高效。
import java.util.concurrent.*;  
  
public class MyCallable implements Callable<String> {  
    @Override  
    public String call() throws Exception {  
        // 线程执行的代码  
        return "Callable result";  
    }  
  
    public static void main(String[] args) throws ExecutionException, InterruptedException {  
        ExecutorService executor = Executors.newSingleThreadExecutor();  
        Future<String> future = executor.submit(new MyCallable());  
        String result = future.get(); // 获取Callable执行的结果  
        System.out.println(result);  
        executor.shutdown(); // 关闭线程池  
    }  
}

除了上述的三种方式,Java还提供了其他高级的多线程编程工具,如ForkJoinPool用于并行计算,SemaphoreCountDownLatch用于同步控制,Atomic类用于线程安全的变量操作等。

在实际应用中,使用线程池(如ExecutorService)是更为常见的做法,因为它能更有效地管理和复用线程,避免大量线程的创建和销毁带来的性能开销。同时,在使用多线程时,还需要注意线程安全问题,例如通过同步代码块(synchronized)或Lock等机制来确保共享数据的正确性。

标签:Runnable,Java,Thread,Callable,如何,线程,run,多线程,public
From: https://blog.csdn.net/meishengjie111/article/details/136774817

相关文章

  • Java中的泛型是如何工作的?
    Java中的泛型(Generics)是JDK5.0引入的一个新特性,它提供了编译时类型安全,允许在定义类、接口和方法时使用类型参数(typeparameters)。泛型的主要目的是在编译时增强类型检查,以减少运行时类型转换的错误,同时保持使用泛型类型时的类型灵活性。以下是Java中泛型工作的几个关键点:类......
  • 计算机毕业设计-基于Java+SSM架构的学生综合考评管理系统项目开发实战(附论文+源码)
    大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • 程序人生——Java开发持续进阶,拥抱开源世界以思想为源泉
    目录引出开源世界建议139:大胆采用开源工具建议140:推荐使用Guava扩展工具包建议141:Apache扩展包建议142:推荐使用Joda日期时间扩展包建议143:可以选择多种Collections扩展思想为源建议144:提倡良好的代码风格建议145:不要完全依靠单元测试来发现问题建议146:让注释正确、清......
  • 程序人生——Java使用关于性能和效率的建议
    目录引出性能和效率建议132:提升Java性能的基本方法建议133:若非必要,不要克隆对象建议134:推荐使用“望闻问切”的方式诊断性能建议135:必须定义性能衡量标准建议136:枪打出头鸟—解决首要系统性能问题建议137:调整JVM参数以提升性能建议138:性能是个大“咕咚”深入认识JVM......
  • 多线程-初阶
    1.认识线程(Thread)1.1概念1)线程是什么一个线程就是一个"执行流".每个线程之间都可以按照顺讯执行自己的代码.多个线程之间"同时"执行着多份代码.还是回到我们之前的银行的例子中。之前我们主要描述的是个人业务,即一个人完全处理自己的业务。我们进一步设想如......
  • 史上最全Java核心面试题(带全部答案)2024年最新版
    今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次。对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦。在跳槽季来临之前,特地做这个系列的文章,一方面帮助自己巩固下基础,另一方面也希望帮助想要换工......
  • 如何突破DRAM对SSD容量提升的限制?
    近日小编看到PureStorage公司的研发高级副总裁肖恩·罗斯马林(ShawnRosemarin)的一个观点“由于DRAM的局限性,固态硬盘(SSD)的容量难以突破30TB”。这个观点不是完全准确,实际上,Solidigm已经发布了最大容量61.44TBQLCSSD。但是,这个观点背后的逻辑依然是业内在提升SSD容......
  • Java 基础语法(2)
    一、流程控制结构1.分支结构if语句if(条件){语句;}elseif(条件){语句;}else{语句;}switch语句switch(变量){case"":语句;break;case"":case"":case"":……语句;break;default:语句;}2.循环结构for循环for(初始化语句......
  • 为 java 开发者设计的性能测试框架,用于压测+测试报告生成
    拓展阅读junit5系列教程基于junit5实现junitperf源码分析Autogeneratemockdataforjavatest.(便于Java测试自动生成对象信息)Junitperformancerelyonjunit5andjdk8+.(java性能测试框架。压测+测试报告生成。)junitperfjunitperf是一款为java开发者设......
  • Java 入门 - 常用的dos命令
    切换盘符盘符名:->回车查看当前路径下的文件或者文件夹dir进入指定文件夹下cd文件夹名字进入到多级文件夹下cd文件夹名字\文件夹名字退到上一级目录cd..或者cd..直接退到磁盘位置(退至根目录)cd\或者cd\清屏cls 退出黑窗口 exit......