java开启线程的四种方法

news2024/11/6 9:27:55

文章目录

  • 1、继承Thread类
    • 1.1 代码实现
    • 1.2 测试结果
  • 2、实现Runnable接口
    • 2.1 方式一:直接实现Runnable接口
      • 2.1.1 代码实现
      • 2.1.2 测试结果
    • 2.2 方式二:匿名内部类
      • 2.2.1 代码实现
      • 2.2.2 测试结果
  • 3、实现Callable接口
    • 3.1 代码实现
    • 3.2 测试结果
  • 4、创建线程池
    • 4.1 代码实例
    • 4.2 测试结果

1、继承Thread类

/*
 * 创建步骤如下:
 * 1,定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务。因此把run方法称为线程执行体。
 * 2,创建Thread子类了的实例,即创建线程对象。本实例中是new一个ExtendThread,即可创建线程对象,也就是开启了一个线程
 * 3,调用线程对象的start()方法来启动该线程。
 *
 * 调用示例:
 * //循环10次即开启10个线程
 * for (int i = 0; i < 10; i++) {
 *     ExtendThread extendThread = new ExtendThread();
 *     extendThread.start();
 * }
 * */

1.1 代码实现

package com.zyz.mynative.demo03;

/**
 * @author zyz
 * @version 1.0
 * @data 2023/2/15 15:51
 * @Description:继承Thread类,重写run方法(不推荐,因为java的单继承局限性)
 */
public class ExtendThread extends Thread {

    public static void main(String[] args) {
        ExtendThread thread = new ExtendThread();
        thread.start();
    }

    /**
     * 重写Thread类的run(),这个方法称为线程执行体
     */
    @Override
    public void run() {
        doSomething();
    }

    /**
     * 需要处理的任务
     */
    public void doSomething() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "执行" + i);
        }
    }
}

1.2 测试结果

在这里插入图片描述


2、实现Runnable接口

2.1 方式一:直接实现Runnable接口

避免单继承的局限性,方便共享资源,推荐使用

/*
 * 创建步骤如下:
 * 1,定义Runnable接口的实现类,并且实现run方法,这个方法同样是线程执行体
 * 2,创建Runnable实现类的实例,并以此实例对象作为Thread的target来创建Thread类,这个新创建的Thread对象才是真正的线程对象,即开启了新的线程
 * 3,调用线程对象的start()方法来开启该线程
 *
 * 调用示例:
 * //开启10个线程
 * for (int i = 0; i < 10; i++) {
 *     Thread thread = new Thread(new RunnableImpl());
 *     thread.start();
 * }
 * */

2.1.1 代码实现

package com.zyz.mynative.demo03;

/**
 * @author zyz
 * @version 1.0
 * @data 2023/2/15 15:57
 * @Description:
 */
public class RunnableImpl implements Runnable {


    public static void main(String[] args) {
        RunnableImpl runnable = new RunnableImpl();
        Thread thread = new Thread(runnable);
        thread.start();

        /**
         * 简写
         * new Thread(runnable).start();
         */

    }

    /**
     * 实现Runnable接口的run方法,这个方法称为线程执行体
     * */
    @Override
    public void run() {
        doSomething();
    }

    /**
     * 需要处理的任务
     * */
    private void doSomething(){
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "执行" + i);
        }
    }
}

2.1.2 测试结果

在这里插入图片描述

2.2 方式二:匿名内部类

/*
 * 创建步骤如下:
 * 匿名内部类本质上也是一个类实现了Runnable接口,重写了run方法,只不过这个类没有名字,直接作为参数传入Thread类
 *
 * 调用示例:
 * //开启10个线程
 * for (int i = 0; i < 10; i++) {
 *     Anonymous anonymous =new Anonymous();
 *     anonymous.myRun();
 * }
 *
 * */

2.2.1 代码实现

package com.zyz.mynative.demo03;

/**
 * @author zyz
 * @version 1.0
 * @data 2023/2/15 15:57
 * @Description:
 */
public class RunnableImpl2 {


    public static void main(String[] args) {
        RunnableImpl2 test = new RunnableImpl2();
        test.myRun();
    }

    public void myRun(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                doSomething();
            }
        }).start();
    }

    /**
     * 需要处理的任务
     * */
    private void doSomething(){
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "执行" + i);
        }
    }
}

2.2.2 测试结果

在这里插入图片描述


3、实现Callable接口

/*
 * 创建步骤如下:
 * 1,定义实现Callable<V>接口的实现类,实现call方法,这个方法是线程执行体
 * 2,创建Callable<V>实现类的实例,借助FutureTask得到线程执行的返回值
 * 3,将FutureTask的实例,作为Thread的target来创建Thread类
 * 4,调用start方法,开启线程
 *
 * 调用示例:
 * Callable<String> tc = new CallableImpl();
 * FutureTask<String> task = new FutureTask<>(tc);
 * new Thread(task).start();
 * try {
 *     System.out.println(task.get());
 * } catch (InterruptedException | ExecutionException e) {
 *     e.printStackTrace();
 * }
 *
 * 说明:
 * 1.与使用Runnable相比, Callable功能更强大些
 * 2.实现的call()方法相比run()方法,可以返回值
 * 3.方法可以抛出异常
 * 4.支持泛型的返回值
 * 5.需要借助FutureTask类,比如获取返回结果
 * Future接口可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。
 * FutureTask是Futrue接口的唯一的实现类
 * FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值
 *
 * */

3.1 代码实现

package com.zyz.mynative.demo03;

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

/**
 * @author zyz
 * @version 1.0
 * @data 2023/2/15 16:08
 * @Description:
 */
public class CallableImpl implements Callable<String> {

    public static void main(String[] args) {
        Callable<String> tc = new CallableImpl();
        FutureTask<String> task = new FutureTask<>(tc);
        new Thread(task).start();
        try {
            System.out.println(task.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }

    private int ticket = 5;

    @Override
    public String call() throws Exception {
        for (int i = 0; i < 10; i++) {
            System.out.println(doSomething());
        }

        return "出票任务完成";
    }

    public String doSomething() {
        String result = "";
        if (this.ticket > 0) {
            result = "出票成功,ticket=" + this.ticket--;
        } else {
            result = "出票失败,ticket=" + this.ticket;
        }
        return result;
    }
}

3.2 测试结果

在这里插入图片描述


4、创建线程池

/*
 * 创建步骤如下:
 * 1,定义Runnable接口的实现类,或者定义(继承Runnable接口的类)的实现类,并且实现run方法,这个方法是线程执行体
 * 2,创建一个自定义线程个数的线程池
 * 3,实例化Runnable接口的实现类
 * 4,将3步的实例,作为线程池实例的execute方法的command参数,开启线程
 * 5,关闭线程池
 *
 * 调用示例:
 * ExecutorService pool = Executors.newFixedThreadPool(2);
 * ThreadPool threadPool = new ThreadPool("AA");
 * ThreadPool threadPoo2 = new ThreadPool("BB");
 * pool.execute(threadPool);
 * pool.execute(threadPoo2);
 * pool.shutdown();
 *
 * 说明:
 * 示例中创建的是2个线程的线程池
 * execute方法是开启线程方法,实参要求是实现Runnable的类。所以,继承Thread类的子类也可以以线程池的方式开启线程
 *
 * */

4.1 代码实例

package com.zyz.mynative.demo03;

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

/**
 * @author zyz
 * @version 1.0
 * @data 2023/2/15 16:11
 * @Description:
 */
public class ThreadPool implements Runnable {



    public static void main(String[] args) {
      ExecutorService pool = Executors.newFixedThreadPool(2);
      ThreadPool threadPool = new ThreadPool("AA");
      ThreadPool threadPoo2 = new ThreadPool("BB");
      pool.execute(threadPool);
      pool.execute(threadPoo2);
      pool.shutdown();
    }

    String name;
    public ThreadPool(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        doSomething();
    }

    /**
     * 需要处理的任务
     * */
    private void doSomething() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "执行" + i + ",name=" + this.name);
        }
    }
}

4.2 测试结果

在这里插入图片描述

资料参考:创建线程池的实现方法

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

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

相关文章

常见帧率计算方法实际效果对比及EasyCVR平台的帧率计算方法

什么是帧、帧数、帧率&#xff1f; 帧 &#xff08;Frame&#xff09; 帧可以理解为视频或者动画中的每一张画面&#xff0c;而视频和动画特效是由无数张画面组合而成&#xff0c;每一张画面都是一帧。 帧数&#xff08;Frames&#xff09; 帧数是帧生成的数量。如果一个动画…

Scala 变量和数据类型(第二章)

第二章、变量和数据类型2.1 注释2.2 变量和常量&#xff08;重点&#xff09;2.3 标识符的命名规范2.4 字符串输出2.5 键盘输入2.6 数据类型&#xff08;重点&#xff09;回顾&#xff1a;Java数据类型Scala数据类型2.7 整数类型&#xff08;Byte、Short、Int、Long&#xff09…

OpenAI CEO喊麦ChatGPT:你很酷,但却是个“糟糕的产品”

OpenAI 联合创始人兼CEO山姆阿尔特曼&#xff08;Sam Altman&#xff09;最近在一档播客节目中称ChatGPT 为“糟糕的产品”。 阿尔特曼说&#xff0c;“人们访问的是一个有时能用&#xff0c;有时不能用的网站。”他指的是ChatGPT频繁出现的错误消息。 他补充说道&#xff1a;…

【GO】K8s 管理系统项目[API部分--Workflow]

K8s 管理系统项目[API部分–Workflow] 年终于算过完了,身体也康复了,继续学习 1. DB设置 1.1 连接配置 service/config.go package configimport "time"const (ListenAddr "0.0.0.0:9091"KubeConfig "D:\\golang\\k8s-plantform\\config\\cka&…

有序表(中):Size Balanced Tree(SBT/SB树)

1、SB树简介 本质上是一棵二叉搜索树&#xff0c;SB树全称 Size Balanced Tree&#xff0c;顾名思义&#xff0c;这是一棵通过大小&#xff08;Size&#xff09;域来维持平衡的二叉搜索树。 它不仅支持简单的二叉搜索树操作&#xff0c;也支持 Select 和 Rank。 定义一下Siz…

每天一道大厂SQL题【Day10】电商分组TopK实战

每天一道大厂SQL题【Day10】电商分组TopK实战 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

Linux入门篇(二)

Linux前言链接文件符号链接&#xff08;软链接&#xff09;硬链接shellshell 的类型shell的父子关系理解外部命令和内建命令外部命令内建命令Linux环境变量PATH环境变量前言 在这一章&#xff0c;我对Linux中有关shell较为深入的理解和环境变量方面知识的一个记录。同时&#x…

PBR工作流实现与对比

工作流实现工作流中的核心内容便是贴图&#xff0c;不论是UE4还是Unity都支持将PBR的参数以贴图的形式传入引擎&#xff0c;我们可以根据一个物体同一mesh或不同mesh的不同区域的属性差异来控制贴图上的属性产生不同&#xff0c;而没有贴图的话&#xff0c;一个物体只能使用一种…

Java Lambda表达式 匿名内部类 函数式接口(FunctionalInterface)

Java Lambda表达式定义背景示例匿名类实现Lambda表达式实现对比匿名类和Lambda实现Lambda表达式&#xff08;调用&#xff09;说明Lambda表达式的语法Java 1.8 新特性&#xff1a;函数式接口jdk 1.8 自带的函数式接口 &#xff08;举例&#xff09;定义 参考Oracle官网&#x…

目标检测6--R-FCN中的Position-Sensitive RoI Pooling

文章目录1.介绍2.Position-Sensitive Score Map 和 Position-Sensitive RoI Pooling3.源码参考资料欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 1.介绍 论文: Region-based Fully Convolutional Networks 代码: R-FCN 本论文作者同9.De…

电子组装流水线MES系统实行条码质量追溯

在电子制造行业&#xff0c;保证生产过程的稳定性与对制造关键能力的改善与提升&#xff0c;是大多数制造企业的管理重心&#xff0c;而缺乏有效的方法与手段。MES系统即制造执行系统&#xff0c;是企业信息集成的纽带&#xff0c;企业实施敏捷制造战略&#xff0c;实现车间生产…

C++学习记录——십 STL初级认识、标准库string类

文章目录1、什么是STL2、STL简介3、什么是string类4、string类的常用接口说明1、常见构造函数2、容量操作3、迭代器4、其他的标准库的string类关于string类的内容&#xff0c;可以在cplusplus.com查看到。 1、什么是STL STL是C标准库的重要组成部分&#xff0c;不仅是一个可复…

指 针

1.指针指针的作用: 可以通过指针间接访问内存&#xff08;可以通过指针的保存一个地址&#xff08;指针--地址&#xff09;&#xff09;内存编号是从0开始记录的&#xff0c;一般用十六进制数字表示。可以利用指针变量保存地址指针变量的定义和使用指针变是定义语法: 数据类型 …

【MFC】模拟采集系统——图形按钮(18)

左边可以简单地使用一个组框&#xff0c;贴上背景图。当然&#xff0c;也可以使用新的对话框。 图形按钮类 1、类向导-》添加类-》选择MFC-》填入新类名称-》选择父类为 CButton 2、添加消息响应函数和虚函数&#xff1a; 消息响应mouse leave (离开&#xff09; mouse move …

CSS3 animation-fill-mode详解

CSS3 animation-fill-mode详解 定义 animation-fill-mode 属性规定当动画不播放时&#xff08;当动画完成时&#xff0c;或当动画有一个延迟未开始播放时&#xff09;&#xff0c;要应用到元素的样式。 默认情况下&#xff0c;CSS 动画在第一个关键帧播放完之前不会影响元素&…

各CCFA类核心期刊的信息汇总与评价总结(科技领域)

CCF中文期刊投稿选择之篇章二:各CCFA类核心期刊的信息汇总与评价总结上一篇章总结一部分期刊的介绍自动化学报相关信息的介绍有关录用比、审稿速度及费用的相关数据收集相关学术论坛上网友的评价与讨论期刊年度出版概况与学术热点动态&#xff08;知网&#xff09;计算机学报相…

2023年可供学习的 10 大 SaaS 知识库工具!

客户迫切希望快速找到所需的信息。在软件行业尤其如此&#xff0c;因为软件行业节奏很快&#xff0c;公司经常销售学习曲线陡峭的产品。为了减缓流失率并提高盈利能力&#xff0c;SaaS 公司正在转向知识库&#xff0c;以帮助他们让客户了解情况。什么是知识库&#xff1f;您可以…

设计模式之代理模式详解和应用

目录1 代理模式定义2 代理模式的应用场景3 代理模式的通用写法4 从静态代理到动态代理5 静态模式在业务中的应用6 动态代理在业务中的应用7 手写JDK动态代理实现原理7.1 JDK动态代理的实现原理7.2 CGLib动态代理容易踩的坑8 CGLib代理调用API及原理分析9 CGLib和JDK动态代理对比…

JVM - 高效并发

目录 Java内存模型和内存间的交互操作 Java内存模型 内存间的交互操作 内存间交互操作的规则 volatile特性 多线程中的可见性 volatile 指令重排原理和规则 指令重排 指令重排的基本规则 多线程中的有序性 线程安全处理 锁优化 锁优化之自旋锁与自适应自旋 锁优…

jvisualvm工具使用

jdk自带的工具jvisualvm&#xff0c;可以分析java内存使用情况&#xff0c;jvm相关的信息。 1、设置jvm启动参数 设置jvm参数**-Xms20m -Xmx20m -XX:PrintGCDetails** 最小和最大堆内存&#xff0c;打印gc详情 2、测试代码 TestScheduleClassGc package com.core.schedule;…