java创建多线程的7种方式---代码详解

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

一、继承Thread类

1.代码示例

public class Thread01 extends Thread {
    // 线程执行的代码在run()方法中,执行完毕后,线程死亡
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "<我是子线程>");
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "子线程执行完毕");
    }

    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName() + "我是主线程");
        //启动线程调用start()方法而不是run()方法 调用start()后线程变为就绪状态,而不是运行状态,还需等待CPU调度运行
        new Thread01().start();
        new Thread01().start();
        System.out.println("---主线程执行完毕---");
    }
}

运行结果如下:

main我是主线程
---主线程执行完毕---
Thread-0<我是子线程>
Thread-1<我是子线程>
Thread-1子线程执行完毕
Thread-0子线程执行完毕

2.总结

可以看出,主线程是不需要等待子线程执行完再执行下面的程序,主线程执行完了子线程还在执行,因此,子线程报错是不会影响主线程的。

二、实现runable接口

1.代码示例

public class Thread02 implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "<我是子线程>");
    }

    public static void main(String[] args) {
        System.out.println("主程序运行");
        new Thread(new Thread02()).start();
        new Thread(new Thread02()).start();
        System.out.println("主程序运行结束---");
    }
}

运行结果:

主程序运行
主程序运行结束---
Thread-0<我是子线程>
Thread-1<我是子线程>

三、使用匿名内部类

public class Thread02 implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "<我是子线程>");
    }

    public static void main(String[] args) {
        System.out.println("主程序运行");
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "<我是子线程>");
            }
        }).start();
        System.out.println("主程序运行结束---");
    }
}

运行结果:

主程序运行
主程序运行结束---
Thread-0<我是子线程>

四、使用lambda表达式

public class Thread02 implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "<我是子线程>");
    }

    public static void main(String[] args) {
        System.out.println("主程序运行");
        new Thread(() -> System.out.println(Thread.currentThread().getName() + "<我是子线程>")).start();
        System.out.println("主程序运行结束---");
    }
}

运行结果:

主程序运行
主程序运行结束---
Thread-0<我是子线程>

五、使用callable和Future创建

1.简介

callable和future现成可以获取到返回的结果,底层是基于LockSupport,从JDK5就提供了Callable接口,该接口是Runable的增强版

2.代码实现

public class ThreadCallable implements Callable<Integer> {
    /**
     * 当前线程需要执行的代码,以及返回结果
     * @return
     * @throws Exception
     */
    @Override
    public Integer call() throws Exception {
        System.out.println("子线程开始执行。。");
        try {
            Thread.sleep(3000);
        } catch (Exception e) {

        }
        System.out.println(Thread.currentThread().getName()+":返回1");
        return 1;
    }
}
public class Thread03  {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ThreadCallable threadCallable = new ThreadCallable();
        FutureTask<Integer> futureTask = new FutureTask<>(threadCallable);
        new Thread(futureTask).start();
        Integer result = futureTask.get();
        System.out.println(Thread.currentThread().getName()+","+result);
    }

}

运行结果如下:

子线程开始执行。。
Thread-0:返回1
main,1

3.注意

futureTask能返回线程的结果其实在调用get()方法时,底层的LockSupport调用LockSupport.park()方法,使主线程挂起等待,等子线程运行完返回结果后,再由LockSupport.unpark()唤起主线程。在子线程未返回结果前,主线程是阻塞等待状态的。

六、使用线程池例如Executor框架创建

public class Thread04 {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(() -> System.out.println("我是子线程"));
    }
}

七、spring @Async异步注解

只需要在调用的方法上写上注释@Async即可,被@Async注释的方式是异步执行的,相当于主线程中会单独另起一个线程执行。文章来源地址https://www.toymoban.com/news/detail-618294.html

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

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

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

相关文章

  • Java并发(三)----创建线程的三种方式及查看进程线程

    例如: 输出 注意:这里通过 @Slf4j 注解打印的日志 把【线程】和【任务】(要执行的代码)分开 Thread 代表线程 Runnable 可运行的任务(线程要执行的代码) 例如: 输出 Java 8 以后可以使用 lambda 精简代码 小结 方法1 是把线程和任务合并在了一起,方法2 是把线程和任务分开

    2023年04月24日
    浏览(49)
  • Java多线程 - 创建的三种方式介绍

    什么是线程 ? 线程(thread)是一个程序内部的一条执行路径。 我们之前启动程序执行后,main方法的执行其实就是一条单独的执行路径。 程序中如果只有一条执行路径,那么这个程序就是单线程的程序。 什么是多线程 ? 多线程是指从软硬件上实现多条执行流程的技术。 方式一

    2024年02月20日
    浏览(45)
  • java创建线程池一共有七种方式

    这 7 种实现方法分别是: Executors.newFixedThreadPool:创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待。 Executors.newCachedThreadPool:创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收,若线程数不够,则新建线程。 Executors.ne

    2024年02月09日
    浏览(37)
  • 【Java面试题】线程创建的三种方式及区别?

    继承Thread类,子类重写run()方法,调用子类的strat()启动线程。 实现Runnable接口,实现run()方法,调用对象start()启动线程。 实现Callable接口,实现call()方法,用FutureTask()封装实现类。使用FutureTask对象作为Thread对象调用start()启动线程,调用FutureTask对象的get()

    2024年02月12日
    浏览(50)
  • 【Java 基础篇】Java多线程编程详解:线程创建、同步、线程池与性能优化

    Java是一门强大的编程语言,其中最引人注目的特性之一是多线程支持。多线程允许我们在同一程序中同时执行多个任务,这大大提高了应用程序的性能和响应能力。本文将深入介绍Java线程的基础知识,无论您是初学者还是有一些经验的开发人员,都将从中获益。 在计算机科

    2024年02月07日
    浏览(57)
  • 大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!

    在Java中,创建线程是一项非常重要的任务。线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高。Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是 继承Thread类、实现Runnable接口和使用线程池。 但是,你们知道吗?

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

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

    2024年02月05日
    浏览(40)
  • Java - JUC(java.util.concurrent)包详解,其下的锁、安全集合类、线程池相关、线程创建相关和线程辅助类、阻塞队列

    JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题 java.lang.Thread.State tools(工具类):又叫信号量三组工具类,包含有 CountDownLatch(闭锁) 是一个同步辅助类,在完成一组正在其他线程中

    2024年02月05日
    浏览(35)
  • Java创建数组、赋值的四种方式,声明+创建+初始化 详解

    以int数据类型为例 注意: new 数据类型[]{},其中花括号可以省去,但要在[ ]中填写数组的个数; 创建多维数组时 new后面第一个方括号中的元素数量不能省略 1、一维数组的声明方式: type[] arrayName; 或 type arrayName[]; 推荐使用第一种格式,因为第一种格式具有更好的可读性,表

    2024年04月11日
    浏览(58)
  • Java/Python/Go不同开发语言在进程、线程和协程的设计差异

    在多线程项目开发时,最常用、最常遇到的问题是 1,线程、协程安全 2,线程、协程间的通信和控制 本文主要探讨不同开发语言go、java、python在进程、线程和协程上的设计和开发方式的异同。 进程 进程是 操作系统进行资源分配的基本单位,每个进程都有自己的独立内存空

    2024年01月23日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包