Java 创建多线程的三种方法

这篇具有很好参考价值的文章主要介绍了Java 创建多线程的三种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Java中创建多线程,往往都要通过Thread类来实现,今天学习下Java中创建多线程的三种方法[1]。

1.继承Thread类

通过继承 Thread类 实现多线程。

主要方法:

  • 1.void run(), 线程开启后,方法将被调用执行
  • 2.void start(), 使此线程开始执行, Java虚拟机会调用run()方法

实现步骤:

  • 1.定义类,继承 Thread类
  • 2.重写 run() 方法
  • 3.创建多线程类对象
  • 4.通过实例方法 start() 启动线程

demo

public class MyThreadExtendsThread extends Thread {
    private int num;
    public MyThreadExtendsThread() {};

    public MyThreadExtendsThread(int num) {
        this.num = num;
    }

    @Override
    public void run() {
        for (int i = 0; i < num; i++) {
            System.out.println(Thread.currentThread().getName() + " 子线程:" + i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new MyThreadExtendsThread();
        Thread t2 = new MyThreadExtendsThread(100000);

        t2.setDaemon(true); // true, 主线程结束,子线程也随之退出, false, 主线程结束后,子线程继续执行

        t1.start();
        t2.start();

        for (int i = 0; i < 10; i++) {
            System.out.println("主线程:" + i);
        }
        // 等待子线程完成任务
        Thread.sleep(10L);
        /*
        子线程:0
        子线程:1
        主线程:0
        子线程:2
        主线程:1
        主线程:2
        主线程:3
        主线程:4
        主线程:5
        主线程:6
        主线程:7
        子线程:3
        子线程:4
        子线程:5
        子线程:6
        子线程:7
        子线程:8
        子线程:9
        主线程:8
        主线程:9
         */
    }
}

2.实现Runnable接口

通过实现 Runnable接口 实现多线程。

主要方法:

  • 1.void run(),重写run方法

实现步骤:

  • 1.定义类,实现 Runnable 接口
  • 2.类中重写 run()方法
  • 3.创建多线程类对象
  • 4.创建 Thread 类对象,通过传入多线程类对象作为构造方法参数
  • 5.通过 Thread 类对象的 start 方法启动线程

demo

public class MyThreadImplementsRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("子线程:" + i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Runnable t1 = new MyThreadImplementsRunnable();
        new Thread(t1).start();

        for (int i = 0; i < 5; i++) {
            System.out.println("主线程:" + i);
        }

        Thread.sleep(1000L);
        /*
        子线程:0
        主线程:0
        主线程:1
        主线程:2
        主线程:3
        主线程:4
        子线程:1
        子线程:2
        子线程:3
        子线程:4
         */
    }
}

3.实现Callable接口

通过实现 Callable接口 实现多线程。

主要方法:

  • 1.V call(), 计算结果,如无,则抛出异常
  • 2.V get(), 如必要,等待计算完成,然后获取结果

实现步骤:

  • 1.定义类实现 Callable 接口
  • 2.在刚定义的类中重写 call()方法
  • 3.创建 MyThreadImplementsCallable 对象
  • 4.创建 Future 接口的实现类 FutureTask 对象,传入 MyThreadImplementsCallable 作为构造方法的参数
  • 5.创建 Thread 类对象,传入FutureTask作为构造方法参数
  • 6.启动线程
  • 7.如有需要,通过调用 get() 方法, 获取线程任务结束后的结果

demo

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class MyThreadImplementsCallable implements Callable {
    private int num;

    public MyThreadImplementsCallable(int num) {
        this.num = num;
    }

    @Override
    public String call() throws Exception {
        int sum = 0;

        for (int i = 0; i < num; i++) {
            sum += i;
        }

        return "线程求出 -> " + num + "之内的和为:" + sum;
    }

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        Callable callable = new MyThreadImplementsCallable(1000);
        // 创建未来任务实现Callable接口
        FutureTask<String> futureTask = new FutureTask<>(callable);
        new Thread(futureTask).start();

        // 获取线程任务结束后的结果
        String res = futureTask.get();
        System.out.println("res: " + res);
        // res: 线程求出 -> 1000之内的和为:499500
    }
}

4.方法对比

以下为多线程中类关系图:

image.png

从关系图中可知:

  • 三种方法实现多线程,都与Runnable接口有关
  • 从实现RUnnable接口的MyRunnable和MyCallable两种方法中,也都要通过Thread类来创建多线程

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享[2]。

总结:

实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

4):线程池只能放入实现Runablecallable类线程,不能直接放入继承Thread的类

参考:文章来源地址https://www.toymoban.com/news/detail-746331.html

  • 多线程详解
  • Java多线程详解-入门篇

到了这里,关于Java 创建多线程的三种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线程创建的三种方式

    目录 1. Thread类 2. Runnable接口 3. Callable接口 4. 线程的生命周期 新建  就绪 运行 阻塞 等待 结束 继承Thread类的方式创建线程 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务 创建Thread类的子类,即创建了线程对象 调用线程对象的

    2024年02月09日
    浏览(32)
  • C++创建线程的三种方式

    早期的C++并不支持多线程的创建,如果要创建多线程,依赖的是系统提供的一些方法(例如linux的 pthread). 从C++11以后开始,提供了std::thread线程库,因此我们可以创建std::thread类对象的方式来创建线程。创建的方式主要有三种: 通过函数指针 通过函数对象 通过lambda函数 使用

    2024年02月16日
    浏览(33)
  • 【Java】详解多线程的概述及三种创建方法

    🌺 个人主页 : Dawn黎明开始 🎀 系列专栏 : Java ⭐ 每日一句 : 身在井隅,心向阳光,眼里有诗,自在远方 📢 欢迎大家:关注 🔍+ 点赞 👍+评论 📝+ 收藏⭐️ 文章目录 一.🔐多线程 📋前言 1.1🔓进程 1.1.1🔑什么是进程? 1.1.2🔑多进程有什么意义呢? 1.2🔓线程 1.2.1🔑什

    2024年02月05日
    浏览(32)
  • Java 实现多线程的三种方式

    1、三种方法的介绍和比较 1、1三种方式得介绍 1、继承Thread类 2、实现Runnable接口 3、实现Callable接口 1、2三种方法的介绍和比较 1、2、1、实现Runnable接口相比继承Thread类有如下优势 1、增强程序的健壮性,将业务逻辑与线程调度分离 2、线程池只能放入实现Runable或Callable类线程

    2024年02月02日
    浏览(37)
  • Java 多线程实现的三种方式

    Java 多线程实现方式主要有三种:继承 Thread 类、实现 Runnable 接口、使用 ExecutorService、Callable、Future 实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1、继承 Thread 类实现多线程 继承 Thread 类的方法尽管被我列为一种多线程

    2023年04月27日
    浏览(43)
  • Java创建文件的三种方式

    内容来自于韩顺平学Java 在学习其视频下跟着编写 文件创建成功

    2024年04月11日
    浏览(51)
  • Java创建数组的三种方式

    这种一般用的比较多。 数组类型 [ ]  数组名称  =  new 数组类型 [ 数组长度 ] 

    2024年02月03日
    浏览(45)
  • 为Java应用创建Docker镜像的三种方式

    在 Dockerfiles 出现的很久之前,Java 开发者大多使用单体应用方式部署(WARs, JARs, EARs, 等等)。现在如你所知,最好的做法是为每个小业务单独部署的微服务方式。你构建的不是一个巨大的单体应用程序,而是使多个可以独立运行的小服务。 这正是 Docker 的用武之地。如果你想

    2023年04月26日
    浏览(37)
  • docker容器:docker镜像的三种创建方法及dockerfile案例

    目录 一、基于现有镜像创建 1、创建启动镜像 2、生成新镜像 二、基于本地模板创建  1、OPENVZ 下载模板 2、导入容器生成镜像 三、基于dockerfile创建  1、dockerfile结构及分层 2、联合文件系统 3、docker镜像加载原理 4、dockerfile操作常用的指令 (1)FROM指令 (2)MAINTAINER 指令 (3)RUN指令

    2023年04月20日
    浏览(48)
  • Java延时的三种方法

    一、Robot,Thread和Timer 打印: 二、补充: 关于方法二的 this.cancel() ; 解释: 取消此计时器任务。如果任务已计划一次执行,但尚未运行,或尚未计划,则它将永远不会运行。如果任务已计划重复执行,则它将永远不会再次运行。(如果此调用发生时任务正在运行,则任务将运

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包