2023.10.7 Java 创建线程的七种方法

news2024/10/1 23:42:45

目录

继承 Tread 类,重写 run 方法

实现 Runnable 接口 

使用匿名内部类,继承 Thread 类

使用匿名内部类,实现 Runable 接口

使用 Lambda 表达式

使用线程池创建线程

实现 Callable 接口 


继承 Tread 类,重写 run 方法

  • 自定义一个 MyThread类,用来继承 Thread 类,重写 run 方法,最后在 main 方法中new 出 MyThread 实例,并调用该实例继承自父类 Thread 类的 start 方法,从而创建一个新线程
//先创建一个类 让该类继承 Thread 父类
class MyThread extends Thread {
//    重写 run 方法
    @Override
    public void run() {
        System.out.println("在 run方法中 自定义线程的工作内容");
    }
}

public class ThreadDemo1 {
    public static void main(String[] args) {
//        创建实例t
        Thread t = new MyThread();
//        启动并创建新线程
        t.start();
//        run 方法仅执行 run方法中的代码,并不会创建一个新线程
//        t.run();
    }
}

注意:

  • 创建实例并不会直接创建一个线程,而是调用到 start 方法才会创建一个新线程
  • 一个进程至少含有一个线程,JVM 默认创建线程为 主线程(main),主线程(main)与 MyThread 创建出来的新线程为并发执行,同时执行,各执行各的

实现 Runnable 接口 

  • 自定义一个 MyRunnable 类,用来实现 Runnable 接口,重写 run 方法,最后在 main 方法中new 出 Thread 实例,并调用该实例的 start 方法,从而创建一个新线程
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("在 run方法中 自定义线程的工作内容");
    }
}

public class ThreadDemo2 {
    public static void main(String[] args) {
//        这只是描述了个任务
        Runnable runnable = new MyRunnable();
//        把任务交给线程来执行
        Thread t = new Thread(runnable);
        t.start();
    }
}

注意:

  • 该方式能将 线程 和 线程要干的活 之间分离开,从而达到 解耦合 的效果
  • 如果要改动代码,不用使用多线程,转而使用多进程、线程池等,此时代码的改动较小

使用匿名内部类,继承 Thread 类

  • 直接创建 Thread 子类,同时实例化出一个对象,重写 run 方法,并调用该实例的 start 方法,从而创建一个新线程
public class ThreadDemo3 {
    public static void main(String[] args) {
        Thread t = new Thread() {
            @Override
            public void run() {
                System.out.println("在 run方法中 自定义线程的工作内容");
            }
        };
        t.start();
    }
}

注意:

使用匿名内部类,实现 Runable 接口

  • 使用匿名内部类,实现 Runnable 接口作为 Thead 构造方法的参数,最后调用实例的 start 方法,从而创建一个新线程
public class ThreadDemo4 {
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("在 run方法中 自定义线程的工作内容");
            }
        });
        t.start();
    }
}

使用 Lambda 表达式

  • lambda 本质为以一个匿名函数,()表示函数的形参,-> 为特殊语法,{ } 表示函数体,以上构成一个 lambda 表达式
public class ThreadDemo5 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            System.out.println("自定义线程的工作内容");
        });
        t.start();
    }
}

使用线程池创建线程

  • ThreadPoolExecutor(线程池)的构造方法写起来很麻烦,但是标准库提供了一系列工程方法来简化其使用
  • 工厂模式:将产品实例的权利移交给工厂,程序员不再通过 new 来创建所需对象,而是通过工厂获取所需产品,降低了产品使用者与使用者之间的 耦合关系
  • 使用线程池不需显示的 new,而是通过 Executors 这个静态方法 new CaChedThreadPool 来完成
  • 当然使用 submit 方法,将任务提交到线程池中,线程池中会有线程来完成这些任务
package Thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadDemo6 {
    public static void main(String[] args) {
        ExecutorService pool = Executors.newCachedThreadPool();

        pool.submit( new Runnable() {
            @Override
            public void run() {
                System.out.println("在 run方法中 自定义线程的工作内容");
            }
        });
    }
}

实现 Callable 接口 

  • 自定义一个 MyCallable 类,实现 Callable 接口,重写 call 方法(call 方法可认为是线程需要执行的任务),并且带有返回值,这个返回表示一个计算结果,如果无法计算结果,则会引发 Exception 异常
  • 再创建 Callable 实例,使用FutrueTast 类包装 Callable 对象,FutureTask 是一个包装器,需要接收 Callable 实例来创建,并且有两个构造函数,一个参数只有 Callable 对象,另一个参数不仅有 Callable 对象,还有一个泛型 result 参数
  • 这里使用 FutureTask 对象作为 Thread 的构造参数,通过 strat 方法创建新线程
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

class MyCallableTest implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        System.out.println("创建线程:" + Thread.currentThread().getName());
        return 1;
    }
}

public class ThreadDemo7 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<Integer> task = new FutureTask<>(new MyCallableTest());
        Thread t = new Thread(task);
        t.start();
        System.out.println("创建线程的返回结果为:" + task.get());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1072346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app项目成功编译到微信开发者工具出现警告:当前组件仅支持 uni_modules 目录结构 ,请升级 HBuilderX 到 3.1.0 版本以上!

问题描述 为什么uni-app项目编译成功后&#xff0c;运行到微信开发者工具&#xff0c;却出现警告&#xff1a;当前组件仅支持 uni_modules 目录结构 &#xff0c;请升级 HBuilderX 到 3.1.0 版本以上&#xff01; 初识uni-app的童鞋&#xff0c;经常会问&#xff1a;我使用HBui…

2019年[海淀区赛 第2题] 阶乘

题目描述 n的阶乘定义为n!n*(n -1)* (n - 2)* ...* 1。n的双阶乘定义为n!!n*(n -2)* (n -4)* ...* 2或n!!n(n - 2)*(n - 4)* ...* 1取决于n的奇偶性&#xff0c;但是阶乘的增长速度太快了&#xff0c;所以我们现在只想知道n!和n!!末尾的的个数 输入格式 一个正整数n &#xff…

酷开会员 | 亚运会来啦!酷开系统陪你一起看赛事!

第十九届亚洲运动会已经开始啦&#xff01;坐标杭州&#xff0c;本次亚运会有来自亚洲45个国家和地区的1.2万余名运动员参赛&#xff0c;是史上规模最大、覆盖面最广的一届亚运会。它是亚洲具有世界性影响的体育盛会&#xff0c;来自亚洲各国和地区的运动员在赛场上奋力拼搏&am…

南美阿根廷市场最全分析开发攻略,收藏一篇就够了

聊到阿根廷&#xff0c;大家可能对阿根廷的足球印象比较深&#xff0c;比如球星梅西&#xff0c;不管是不是球迷应该大部分都有听说过&#xff0c;阿根廷作为南美洲面积第二大的国家&#xff0c;市场潜力也是非常不错的&#xff0c;今天就主要来聊一下关于阿根廷市场的一些相关…

工作流程引擎有几个特点?可以提高办公效率吗?

如果想要实现高效率的自动化办公&#xff0c;还依靠传统的办公软件是没有办法实现的。在自动化发展程度越来越高的今天&#xff0c;职场办公也拥有了优质的办公软件&#xff0c;助力实现高效率办公。低代码技术平台是专业的企业级应用低代码平台&#xff0c;其中的工作流程引擎…

深入理解树状数组 | 京东物流技术团队

树状数组 树状数组&#xff08;BIT, Binary Indexed Tree&#xff09;是简洁优美的数据结构&#xff0c;它能在很少的代码量下支持单点修改和区间查询&#xff0c;我们先以a[] {1, 2, 3, 4, 5, 6}数组为例建立树状数组看一下树状数组的样子&#xff1a; 可以发现&#xff1a;不…

websocket协议 | http协议

文章目录 一、前言二、websocket协议2.1 怎么建立websocket连接 三、HTTP协议3.1 特点3.2 报文格式3.3 连接方式三次握手四次挥手 3.4 版本HTTP 1.0HTTP 1.1 3.1 http长轮询场景&#xff1a;扫码登陆 四、二者比较4.1 相同4.2 区别1.通讯方式不同2.通信效率3.数据格式 一、前言…

XD 文件怎么打开,一分钟快速搞定

Adobe XD 是一款强大的用户界面和用户体验设计工具&#xff0c;广泛用于创建交互式原型、网站和移动应用程序&#xff0c;其中包含设计的所有元素和交互信息。 如果你拿到.xd 文件&#xff0c;却没有安装 Adobe XD 软件&#xff0c;下载安装步骤也很繁琐&#xff0c;纠结如何打…

LeetCode刷题笔记【34】:动态规划专题-6(完全背包、零钱兑换II、组合总合IV)

文章目录 前置知识经典完全背包问题(纯完全背包问题)题目描述解题思路如何实现"物品可以被多次添加"?遍历物品和遍历背包容量(内外层遍历)能否调换? 代码 518. 零钱兑换 II题目描述解题思路初始化&递推公式内层for循环顺序内外层for循环的顺序(先遍历物品还是先…

聊聊电商系统架构演进

具体以电子商务网站为例&#xff0c; 展示web应用的架构演变过程。 1.0时代 这个时候是一个web项目里包含了所有的模块&#xff0c;一个数据库里包含了所需要的所有表&#xff0c;这时候网站访问量增加时&#xff0c;首先遇到瓶颈的是应用服务器连接数&#xff0c;比如tomcat连…

含叠氮的代谢糖蛋白标记试剂361154-30-5,N -叠氮乙酰基甘露糖胺-四酰基化

产品简介&#xff1a;N-叠氮乙酰基甘露糖胺-三酰化&#xff08;AC4MANAZ&#xff09;可用作标记试剂&#xff0c;点击糖化学试剂&#xff0c;叠氮化物基团允许它与炔烃反应&#xff0c;是一种含叠氮的代谢糖蛋白标记试剂&#xff0c;叠氮化物修饰的蛋白质可以通过与炔烃反应检测…

(c语言进阶)指针的进阶

一.字符指针 1.一般应用 &#xff08;1&#xff09;%c的应用 &#xff08;2&#xff09;%s的应用 字符指针没有权限通过解引用去改变指针指向的值 2.笔试题 题目&#xff1a;判断输出结果 int main() { const char* p1 "abcdef"; const char* p2 "…

《ImageNet Classification with Deep Convolutional Neural Networks》阅读笔记

论文标题 《ImageNet Classification with Deep Convolutional Neural Networks》 ImageNet &#xff1a;经典的划时代的数据集Deep Convolutional&#xff1a;深度卷积在当时还处于比较少提及的地位&#xff0c;当时主导的是传统机器学习算法 作者 一作 Alex Krizhevsky 和…

点餐小程序实战教程07-点餐功能开发

目录 1 菜品列表功能2 给分类添加排序字段3 给数据列表设置筛选条件4 实现数量选择5 全局变量定义6 选购数量初始化总结 上一篇我们介绍了菜品分类功能&#xff0c;主要是使用侧边选项卡组件来实现。在点餐场景中&#xff0c;我们在选中分类的时候是希望看到分类下的菜品&#…

面试官:听说你很懂SpringMVC,那讲讲其内部对于请求的处理吧!

本系列文章皆在分析SpringMVC的核心组件和工作原理&#xff0c;让你从SpringMVC浩如烟海的代码中跳出来&#xff0c;以一种全局的视角来重新审视SpringMVC的工作原理. 作者&#xff1a;毅航 在过去的很长一段时间内&#xff0c;笔者对SpringMVC中的核心控制器DispatcherServle…

《鱿鱼游戏》杀入体验店 SandboxVR未能复制神话

曾经火爆全网的剧集《鱿鱼游戏》这回真的变成游戏了&#xff0c;而且还是能身临其境去玩的那种。 9月底&#xff0c;沉浸式游戏社交公司Sandbox VR与全球知名流媒体Netflix合作&#xff0c;将《鱿鱼游戏》搬入VR体验店&#xff0c;用线下场地VR的方式&#xff0c;重现123木头人…

jvm--执行引擎

文章目录 1. 执行引擎的工作流程2. 解释器、JIT及时编译器3. 热点代码及探测技术4. HotSpotVM 中 JIT 分类 执行引擎属于 JVM 的下层&#xff0c;里面包括解释器、及时编译器、垃圾回收器 JVM 的主要任务是负责 装载字节码到其内部&#xff0c;但字节码并不能够直接运行在操作…

vite+vue3+ts中使用require.context | 报错require is not defined | 获取文件夹中的文件名

vitevue3ts中使用require.context|报错require is not defined|获取文件夹中的文件名 目录 vitevue3ts中使用require.context|报错require is not defined|获取文件夹中的文件名一、问题背景二、报错原因三、解决方法 一、问题背景 如题在vitevue3ts中使用required.context时报…

JDK21 要来了,,你不会还在用 Java 8吧!

目前 Java 的最新稳定版是 JDK 20&#xff0c;但这是个过渡版&#xff0c;JDK21就是 LTS 版的了&#xff0c;也快要发布了&#xff0c;在今年9月份&#xff08;也就是2023年9月&#xff09;就要正式发布了。 但是&#xff0c;猜都不用猜&#xff0c;你肯定还在用 Java 8 吧&…

【密评】商用密码应用安全性评估从业人员考核题库(七)

商用密码应用安全性评估从业人员考核题库&#xff08;七&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 1501 判断题 在公钥密码体制中&#xff0c;使用接收方的公钥加密的消…