Thread类创建线程

2023-11-15

目录

1.在java中执行多线程编辑

1.1通过Thread类创建线程

1.2创建线程方法2

1.3创建线程方法3

1.4创建线程方法4

1.5创建线程方法5

2.多线程执行效率

2.1两个变量同时自增

3.Thread常见构造方法和属性

3.1Thread中的重要方法

3.1.1Thread.start()和Thread.run()方法的区别


1.在java中执行多线程编辑

在java标准库中,给我们提供了一个标准的Thread类,来操作线程。Thread 类也可以视为是 Java 标准库提供的 API(API:Thread 类提供的方法 和 类)。当我们创建好Thread对象,其实和操作系统中的线程是相对应的。即如果我们想要先创建一个线程,就要先创建一个Thread类的对象。

1.1通过Thread类创建线程

首先我们先创建子类,让其继承Thread,并且重写run方法

我们这里的创建线程都是在同一个进程内部实现的。另外我们为了更清楚的表示线程的并发执行,再来举其他的例子:

1.2创建线程方法2

即创建一个类实现Runnable接口,再创建 Runnable实例,并传给Thread实例

通过 Runnable 来描述任务的内容
进一步的再把描述好的任务交给 Thread 实例

class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("hello Thread");
    }
}
public class TestDemo2 {
    public static void main(String[] args) {
        //这里我们实例化的是Thread本身
        //构造方法里面指定了Runnable实例
        Thread t = new Thread(new MyRunnable());
            t.start();

    }
}

1.3创建线程方法3

public class TestDemo3 {
    public static void main(String[] args) {
        Thread t = new Thread(){
            @Override
            public void run() {
                System.out.println("hello Thread");
            }
        };
        t.start();
    }
}

这里使用了匿名内部类,同时重写run方法和new了个匿名内部类的实例

1.4创建线程方法4

public class TestDemo4 {
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello thread");
            }
        });
        t.start();
    }
}

针对 Runnable 接口 创建的 匿名内部类(这个匿名内部类实现了Runnable 接口)。
同时 将创建出的实例 作为 参数 传给了 Thread 的构造方法.

小结:上述四个方法,我们认为Runnable方法更好一点,因为它能够让线程与线程之间的任务更能够解耦,即让代码之间高内聚,低耦合。即同一类功能的代码放一起,不同功能模块之间,没有关系。也就是说,Runnable只是单纯的描述了一个任务的具体内容,但要怎么执行,它并不关心。

1.5创建线程方法5

public class TestDemo5 {
    public static void main(String[] args) {
            //这是方法4的简化,其中()表示无参数的run方法
            Thread t = new Thread(()->{
            System.out.println("hello Thread");
        });
        t.start();
    }
}

2.多线程执行效率

2.1两个变量同时自增

public class TestDemo6 {
    private static final long count = 10_0000_0000;

    public static void serial() {
        //记录自增开始的时间
        long begin = System.currentTimeMillis();
        long a = 0;
        for (int i = 0; i < count; i++) {
            a++;
        }
        long b = 0;
        for (int i = 0; i < count; i++) {
            b++;
        }
        //记录自增结束的时间
        long end = System.currentTimeMillis();
        System.out.println("花费时间:" + (end - begin) + "ms");
    }


    public static void concurrency() throws InterruptedException {
        long begin = System.currentTimeMillis();
        Thread t1 = new Thread(() -> {
            long a = 0;
            for (int i = 0; i < count; i++) {
                a++;
            }
        });
        t1.start();

        Thread t2 = new Thread(() -> {
            long b = 0;
            long a = 0;
            for (int i = 0; i < count; i++) {
                b++;
            }
        });
        t2.start();

        t1.join();//让main线程等待t1线程执行结束

        t2.join();//让main线程等待t2线程执行结束
        long end = System.currentTimeMillis();
        System.out.println("多线程花费的时间:" + (end - begin));

    }

    public static void main(String[] args) throws InterruptedException {
        //serial();
        concurrency();
    }

}

       虽然这里我们使用多线程效率提高了,但这也是适合数据计算比较多的情况下。如果数据很少,我们就没必要使用多线程,因为创建多线程也是需要花费时间和空间的。因此使用多线程的时候还要看适用场景。

3.Thread常见构造方法和属性

                              方法
Thread() 创建线程对象
Thread(Runnable target) 使用 Runnable 对象创建线程对象
Thread(String name) 创建线程对象,并命名
Thread(Runnable target, String name) 使用 Runnable 对象创建线程对象,并命名
Thread(ThreadGroup group,Runnable target) 线程可以被用来分组管理,分好的组即为线程组,这个目前我们了解即可

3.1Thread中的重要方法

3.1.1Thread.start()和Thread.run()方法的区别

 因此run()只是一个普通方法,描述一个任务的内容,而且是串行执行,不创建线程。而start()才创建线程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Thread类创建线程 的相关文章

  • 在Java Servlet中获取通过jquery ajax发送的参数[重复]

    这个问题在这里已经有答案了 我在网上搜索这个主题 但找不到有效的示例 我会很高兴有人能给我帮助 这就是我测试的 ajax url GetJson type POST dataType json contentType application
  • 使用 TLS PSK 加密时如何正确检测流结束?

    我已经准备好了一个简单的 TLS PSK 客户端测试用例 https github com afarber jetty newbie tree master TlsPskClient2 src main java de afarber tl
  • 来自行号的方法名称

    给定特定类源代码 Java C 的行号 是否有一种简单的方法来获取它所属的方法的名称 如果它落入其中 大概使用抽象语法树 这对于将 checkstyle 的输出限制为仅触及的方法很有用 我假设您必须使用抽象语法树来执行 Line gt Me
  • IBM Websphere MQ - 用于 Tomcat 部署的 EJB 和 MDB 迁移

    我已经为此苦苦挣扎了很长一段时间 我有一个 IBM Websphere MQ 它使用 EJB 和 MDB 以下是配置ejb mdb的地方
  • java 拖放

    我尝试熟悉java中的拖放 但我发现的所有教程都是 让我生气 我想要的只是从 JList 包含在名为 UserPanel 的自制 JPanel 中 拖动 PublicUserLabel 并将其放入从 JTabbedPanel 继承的自制类中
  • 传递自定义类型查询参数

    如何接受自定义类型查询参数 public String detail QueryParam request final MYRequest request 上面的行在启动服务器时出现错误 jersey server model ModelV
  • 用于制作代码编辑器的 JavaFX 相当于 JSyntaxPane 的什么?

    以前在 Swing 中 我使用过JSyntaxPane用于制作一个小型 Java 源代码编辑器 为了练习 我决定用 JavaFX 重做整个项目并添加对更多语言的支持 最好是尽可能多 不过好像没有什么类似的JSyntaxPane 一些研究让我
  • 如何使用 aether 从 Java 找到最新版本的 Maven 工件?

    他们的文档非常薄弱 我无法弄清楚 我找到了部分答案here https stackoverflow com questions 27428068 how to retrieve the latest also snapshot versio
  • 在 doxygen 中使用 @see 或 @link

    我之前用 Javadoc 记录并使用了标签 see link or see foo and link foo 在我的描述中链接到其他课程 现在我尝试了doxygen 似乎这些标签不兼容 如果我运行 doxygen 完整的标签将被简单地解释为
  • 我的 Kafka 流应用程序刚刚退出,代码为 0,什么也不做

    为了尝试 Kafka 流 我这样做了 public static void main String args final StreamsBuilder builder new StreamsBuilder final Properties
  • 从字符串中删除重音符号

    Android 中有没有什么方法 据我所知 没有 java text Normalizer 可以从字符串中删除任何重音 例如 变成 eau 如果可能的话 我想避免解析字符串来检查每个字符 java text NormalizerAndroi
  • React Native v0.71.8 React-native-vector-icons 你看不到的图标

    我在用react native版本v0 71 8 我安装了react native vector icons库 但图标未显示 似乎链接在最新版本的 React Native 中不再起作用 所以我按照说明进行操作 但它不再编译 出现以下错误
  • 在 Eclipse RCP 应用程序中禁用插件贡献

    我经常遇到这个问题 但尚未找到解决方案 每当我编写一个新的基于 Eclipse RCP 的应用程序并包含来自 Eclipse 平台的插件时 我都会 继承 其中一些插件的 UI 贡献 大多数贡献 菜单项 键盘快捷键 属性页 都很有用 但有时我
  • 线程数组?

    所以我在理解如何避免线程的顺序执行时遇到了问题 我试图创建一个线程数组并在单独的循环中执行 start 和 join 函数 这是我现在拥有的代码示例 private static int w static class wThreads im
  • 为什么/何时应该使用泛型方法?

    学习Java的时候遇到过通用方法 public
  • ebean 映射到 BYTEA 的数据类型是什么?

    我有一个游戏 2 0 2 需要在数据库中存储一些文件的应用程序 我们使用 Ebean 作为 ORM 我相信我的数据库中需要一个 BYTEA 列来存储该文件 但我不确定在我的模型中使用什么数据类型 我应该使用某种Blob 或者只是一个byte
  • 用于生成 ISO 文件的 Maven 插件

    有没有可以生成ISO镜像的maven插件 我需要获取一些模块的输出 主要是包含 jar 的 zip 文件 并将它们组合成一个 ISO 映像 Thanks 现在有一个 ISO9660 maven 插件可以完成这项工作 https github
  • 假布尔值=真?

    我在一本书中找到了这段代码 并在 Netbeans 中执行了它 boolean b false if b true System out println true else System out println false 我只是不明白为什
  • Graphics2D setfont() 严重减慢了 java 应用程序的启动速度

    我正在用java制作一个游戏 它每秒刷新60次 每次执行循环时 我都会使用 g2d 来绘制图像和字符串 如果我这样做的话一切都会很好g2d setFont new Font Arial Font PLAIN 8 和抽绳 这将是正常的 但如果
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • 英语 面包为什么不可数?

    接下来我就来解释一下 因为首先面包的形态多种多样 不同的人就有不同的做法 有时候依据面包的形态很难界定面包到底是多少 个 其次面包通常不能直接出售 都要有包装的保护 同理 像蛋糕 巧克力 家具等 它们可以由创造者自由塑形 量化 又往往成一定
  • 金融区块链基础设施(浅析)

    想知道更多更多关于区块链技术知识 请百度 链客区块链技术问答社区 链客 有问必答 Optherium Labs是一家全球金融科技公司和区块链即服务提供商 是Linux Hyperledger和Crypto Valley基金会的成员 在欧盟获
  • SpringBoot使用Nacos动态配置数据源

    SpringBoot SpringCloud项目部署运行后 如果使用硬编码方式定义数据源 那么如果需要更换数据库 就只能通过更改源码并重启的方式来达成目的 而SpringCloud生态中有配置中心这一组件 我们可以将数据源连接属性编写在配置
  • centos7修改语言环境($LANG)

    文章目录 1 问题 2 系统环境 3 解决方案 1 问题 安装centos7系统时 我默认选择的是LANG zh CN UTF 8 在执行各种命令后 英文中掺杂的中文显得有点格格不入 于是我想要将语言环境改成全英文的 2 系统环境 root
  • vue(9):自定义指令

    自定义指令 除了默认设置的核心指令 v model 和 v show Vue 也允许注册自定义指令 示例 注册一个全局指令 v focus 该指令的功能是在页面加载时 元素获得焦点 div p 请输入 p div
  • Java8 Stream 之sorted方法 排序讲解

    本文主要讲解 Java 8 Stream之sorted 排序示例 使用java 8 的流式sorted排序List集合 Stream sorted 字段排序 功能说明 以自然序或着自定义Comparator 接口排序规则来排序一个流 功能详
  • Vue组件化开发

    一 组件基础 1 组件介绍 组件 是一个独立显示的视图单元 在构建大型应用时 我们通常会把可复用性强的部分 例如 头部导航 侧边栏等需要在多个页面展示的部分 提取出来 最终组合成一个完整的页面 在vue中 组件是可复用的vue实例 2 组件
  • SVG: draw text

  • 对比学习系列(二)---MoCo 系列

    MoCo 系列 文章目录 MoCo 系列 自监督 MoCo V1 前言 动量对比 Dictionary as a queue Momentum update 代理任务 Shuffling BN 实验 MoCo V2 MoCo V3 参考 自
  • Proteus 8.9原理图转换为PCB图

    Proteus 8 9原理图转换为PCB图 1 点击PCB设计图标 2 定义边界 在Board Edge图层建立矩形 此矩形内放置所有元器件 3 选用自动布局 Auto Placer 勾选所有器件 也可手动布置 没有的元器件封装可以重新选择
  • java初阶---类和对象

    一 类和类的实例化 1 类就是一类对象的统称 对象就是这一类具体化的一个实例 一个类可以实例化无数个对象 2 声明一个类就是创建一个新的数据类型 而类在java中属于引用类型 java使用关键字class来声明类 3 基本语法 创建类 cl
  • “Failed to initialize NVML

    Checking nvidia driver version with error Failed to initialize NVML GPU access blocked by the operating system 解决办法 360安
  • 最大的以1为边界的正方形--动态规划

    leetcode 1139 最大的以1为边界的正方形 题目描述 给你一个由若干 0 和 1 组成的二维网格 grid 请你找出边界全部由 1 组成的最大 正方形 子网格 并返回该子网格中的元素数量 如果不存在 则返回 0 示例1 输入 gr
  • Macbook Pro 鼠标卡顿问题

    Macbook Pro 鼠标卡顿问题 目前无解 只能改善 该问题最早能追溯到 2015年 https jingyan baidu com article ff42efa93632c5c19e220208 html 原因 据说是无线频段冲突
  • 手把手教会机器学习(一)——特征工程

    Python机器学习 一 特征工程 特征工程 特征 Feature 当建立预测模型时 用以对结构经行分析预判 且与预测对象有较大相关性的变量 特征提取 Feature Extraction 特征的提取应注意避免提取到相关含义的变量 避免提取
  • mysql基本语句:DML(数据操作语言)

    目录 DML语言 1 INSERT 添加数据语句 2 UPDATE 更新数据语句 3 SQL中的运算符 4 DELETE 删除数据语句 DML语言 DML 数据操作语言 用于操作数据库对象中所包含的数据 DML包括 INSERT 添加数据语
  • dbeaver对数据进行可视化编辑

    进入数据编辑界面 然后在操作栏上点击编辑即可看到
  • java学习路线

    Java 学习路线 Java 学习路线一条龙版 by 程序员鱼皮 建议先观看视频导读 https www bilibili com video BV1Qf4y1K7ff 大纲 路线特点 最新 完整一条龙的大厂 Java 学习路线 从入门到入
  • 遥感影像分类之SVM

    目录 一 背景简介 二 环境介绍 三 分类步骤 3 1 训练数据预处理 3 2 导入相关扩展包 3 2 读取训练数据与训练标签 3 3 确定参数g和c 3 4 使用svm训练模型 3 5 使用模型进行分类 四 分类结果显示与保存 4 1 结
  • Thread类创建线程

    目录 1 在java中执行多线程编辑 1 1通过Thread类创建线程 1 2创建线程方法2 1 3创建线程方法3 1 4创建线程方法4 1 5创建线程方法5 2 多线程执行效率 2 1两个变量同时自增 3 Thread常见构造方法和属性