JAVA多线程并发(一):线程的创建

news2025/2/26 0:38:04

JAVA多线程并发——创建线程

第一章:线程的创建与实现


文章目录

  • JAVA多线程并发——创建线程
  • 一、继承Thread类
  • 二、实现runnable接口
  • 三、简单匿名内部类写法
  • 四、实现Callable接口
  • 五、线程池


一、继承Thread类

代码示例:

public class ExtendThread {
    public static void main(String[] args) {
        Thread thread1 = new MyThread(1);
        Thread thread2 = new MyThread(2);
        thread1.start();
        thread2.start();
    }

    public static class MyThread extends Thread {

        int num;

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

        @Override
        public void run() {
            System.out.println("我是线程"+ num);
        }
    }
}

运行结果:
在这里插入图片描述

二、实现runnable接口

代码示例:

/**
 * 通过实现Runnable接口创建线程
 * 线程无返回值
 */
public class implementRunnable {
    public static void main(String[] args) throws InterruptedException {
        Runnable runnable1 = new MyRunnable(1);
        Runnable runnable2 = new MyRunnable(2);
        Thread thread1 = new Thread(runnable1);
        Thread thread2 = new Thread(runnable2);
        thread1.start();
        Thread.sleep(1000);
        thread2.start();
    }


    public static class MyRunnable implements Runnable {
        int num;

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

        @Override
        public void run() {
            System.out.println("我是线程" + num);
        }
    }
}

运行结果:
在这里插入图片描述

三、简单匿名内部类写法

代码示例:

public class innerRunnable {

    public static void main(String[] args) {
        System.out.println("我是原线程");

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我是新线程");
            }
        });
        thread.start();
    }
}

运行结果:
在这里插入图片描述

四、实现Callable接口

该方式创建线程可以获取新线程的返回值,上面的方法均无返回值
示例代码:

/**
 * 通过实现Callable接口实现
 * 线程有返回值
 */
public class implementCallable {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallable myCallable1 = new MyCallable(1);
        FutureTask<String> futureTask1 = new FutureTask<>(myCallable1);
        Thread thread1 = new Thread(futureTask1);
        thread1.start();
        String str1 = futureTask1.get();
        System.out.println("线程返回值:" + str1);

        MyCallable myCallable2 = new MyCallable(2);
        FutureTask<String> futureTask2 = new FutureTask<>(myCallable2);
        Thread thread2 = new Thread(futureTask2);
        thread2.start();
        String str2 = futureTask2.get();
        System.out.println("线程返回值: " + str2);
    }

    public static class MyCallable implements Callable<String>{

        int num;

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

        @Override
        public String call() throws Exception {
            System.out.println("新线程" + num + "开始执行");
            return "创建了线程" + num;
        }
    }
}

运行结果:
在这里插入图片描述

五、线程池

推荐使用最后一种,new ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
RejectedExecutionHandler handler) ;


/**
 * 通过Executor的几个默认的线程池配置
 */
public class ByExecutor {

    public static void main(String[] args) {
        //createCachedThreadPool();
        //createFixThreadPool();
        //createScheduledThreadPool();
        //createSingleThreadPool();
        createByThreadPoolExecutor();
    }

    /**
     * newCachedThreadPool
     * 核心线程数无限大
     * 会重复利用之前的线程
     * 没有旧线程会创建新线程
     */
    private static void createCachedThreadPool() {
        ExecutorService threadPool = Executors.newCachedThreadPool();
        while (true) {
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("我是线程" + Thread.currentThread().getName());

                }
            });
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * newFixedThreadPool
     * 固定线程数
     * 当前没有可用线程则会等待
     * 不会创建新线程
     */
    private static void createFixThreadPool() {
        ExecutorService threadPool = Executors.newFixedThreadPool(3);
        while (true) {
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("我是线程 " + Thread.currentThread());
                }
            });
        }
    }

    /**
     * newScheduledThreadPool
     * 支持延时执行
     * 固定线程数
     */
    private static void createScheduledThreadPool() {
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);
        long delay = 5;
        System.out.println(new Date().getSeconds());
        while (true) {
            scheduledThreadPool.schedule(new Runnable() {
                @Override
                public void run() {
                    System.out.println("我是定时线程:" + Thread.currentThread() + new Date().getSeconds());
                }
            }, delay, TimeUnit.SECONDS);
        }
    }

    /**
     * newSingleThreadPool
     * 单线程
     */
    private static void createSingleThreadPool() {
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
        while (true) {
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("我是single线程 " + Thread.currentThread());
                }
            });
        }
    }

    /**
     * 推荐的使用线程池的方式,通过构造方法创建
     */
    private static void createByThreadPoolExecutor() {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                2,
                2,
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(2),
                new ThreadPoolExecutor.CallerRunsPolicy());

        for (int i = 0; i < 10; i++) {
            //创建任务
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName());
                }
            };
            // 将任务交给线程池管理
            threadPoolExecutor.execute(runnable);
        }
    }
}


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

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

相关文章

SPARKSQL3.0-Unresolved[Parsed]阶段源码剖析

一、前言 上两节介绍了Antlr4的简单使用以及spark中如何构建SessionState&#xff0c;如果没有看过建议先了解上两节的使用&#xff0c;否则看本节会比较吃力 [SPARKSQL3.0-Antlr4由浅入深&SparkSQL语法解析] [SPARKSQL3.0-SessionState构建源码剖析] 那么在Unresolved…

MySql查询的生命周期和性能优化思路

目录 前言 1. 为什么查询性能差 2. 一次查询的生命周期 2.1 客户端与服务端通信 2.2 查询缓存 2.3 解析器 2.4 预处理器 2.5 优化器 2.6 查询引擎 2.7 存储引擎 3. 查询性能优化的思路 4.总结 前言 一说到mysql的查询性能优化&#xff0c;相信很多人能说出来很多的技…

AT32F407/437使用FreeRTOS并实现ping客户端

示例目的 基于以太网络&#xff0c;实现ping客户端已检测网络联机。 支持型号 AT32F407xx AT32F437xx 主要使用外设 EMAC GPIO USART 快速使用方法硬件资源 1) 指示灯LED2/LED3 2) USART1(PA9/PA10) 3) AT-START-F407/ AT-START-F437实验板 4) 以太网连接线软件资源 1) SourceC…

sql函数coalesce和parse_url

学习函数系列&#xff1a; coalesce coalesce函数可以用来排除null值。 coalesce(a, b,c,d) 参数的个数没有限制 返回第一个参数中非null的值。 select help coalesce\G; [ 1. row ] name | COALESCE description | Syntax: COALESCE(value,…) Returns the first non-NUL…

15-JavaSE基础巩固练习:多态、接口、抽象类的综合练习

多态的综合练习 1、需求 狗类 属性&#xff1a;年龄&#xff0c;颜色行为&#xff1a; eat(String something)&#xff1a;表示吃东西lookHome()&#xff1a;看家 猫类 属性&#xff1a;年龄&#xff0c;颜色行为&#xff1a; eat(String something)&#xff1a;吃东西catch…

5G工业互联阶段二:5G产线工控网

5G深入核心生产环节的第二个阶段&#xff0c;主要是实现产线内部通信5G化。以工控5G化为主&#xff0c;并综合考虑数采、安全通信等。大致示意如下&#xff1a; 工艺部件工控通信5G化&#xff1a; 如上图所述&#xff0c;以产线主PLC为中心&#xff0c;大致分为主PLC到产线内机…

Spark 3.0 - 5.ML Pipeline 实战之电影影评情感分析

目录 一.引言 二.Stage1 - 数据准备 1.数据样式 2.读取数据 3.平均得分与 Top 5 4.训练集、测试集划分 三.Stage-2 - Comment 分词 1.Tokenizer &#x1f645;&#x1f3fb;‍♀️ 2.JieBa 分词 &#x1f646;&#x1f3fb;‍♀️ 2.1 Jieba 分词示例 2.2 自定义 Jie…

系统设计 system design 干货笔记

参考大佬的博客 https://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache 参考的github https://github.com/donnemartin/system-design-primer#step-2-review-the-scalability-article scalability 1 Clone 每台服务器都包含完全相同的代码库&#…

SOLIDWORKS 2023 3D Creator 云端结构设计新功能

3DEXPERIENCE平台更新版本已经与大家见面&#xff0c;今天微辰三维与大家分享3D Creator 云端结构设计新功能&#xff0c;让我们先一起来看看视频—— SOLIDWORKS 2023 3D 云端结构设计新功能点击观看3D Creator 云端结构设计新功能 如今&#xff0c;我们的设计生产工作不仅要面…

Linux进阶-Makefile

make工具&#xff1a;找出修改过的文件&#xff0c;根据依赖关系&#xff0c;找出受影响的相关文件&#xff0c;最后按照规则单独编译这些文件。 Makefile文件&#xff1a;记录依赖关系和编译规则。 Makefile本质&#xff1a;无论多么复杂的语法&#xff0c;都是为了更好地解决…

m认知无线电网络中频谱感知的按需路由算法matlab仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 使用无线电用户的频率范围在 9kHz 到 275GHz[3]&#xff0c;由于无线通信环境中的干扰、信道衰落和无线电收发设备自身属性等的影响&#xff0c;大部分无线电设备只能工作在 50GHz 以下。…

融媒体解决方案-最新全套文件

融媒体解决方案-最新全套文件一、建设背景二、建设思路三、建设方案二、获取 - 融媒体全套最新解决方案合集一、建设背景 随着互联网的快速发展&#xff0c;社会已步入全媒体时代&#xff0c;各媒体机构积极探索传统媒体转型之路。 为巩固壮大主流思想舆论&#xff0c;不断提…

对数的应用:放缩x轴或者y轴以更好地表达函数的结果

对数尺度的作用 yAxnyAx^nyAxn 在实验中 AAA 和 nnn 都是未知数&#xff0c;现在我想求出 AAA 和 nnn假设 n1.5,A1n1.5, A1n1.5,A1&#xff0c;那么我们可以做个图看看 x np.linspace(1,10,10) y 1 * x**3 plt.plot(y)如果我做实验恰好得到一些点&#xff0c;那么我很难知道…

【全志T113-S3_100ask】14-1 linux采集usb摄像头实现拍照(FFmpeg、fswebcam)

【全志T113-S3_100ask】14-1 linux采集usb摄像头实现拍照背景&#xff08;一&#xff09;FFmpeg1、简介&#xff1a;2、交叉编译FFmpeg3、测试&#xff08;二&#xff09;fswebcam1、背景2、交叉编译fswebcam3、测试背景 在开发板上有一个csi转dvp接口的摄像头&#xff0c;但是…

前端入门到放弃(VUE、ES6,简单到不得了)

VSCode 使用 1、安装常用插件 切换到插件标签页 安装一下基本插件 2、创建项目 vscode 很轻量级&#xff0c;本身没有新建项目的选项&#xff0c;创建一个空文件夹就可以当做一个项目 3、创建网页 创建文件&#xff0c;命名为 index.html 快捷键 !快速创建网页模板 h1 回…

精益管理学会|什么是ECRS改善方法?

ECRS是IE工程改善、精益生產管理改善的四大法宝。 针对现有的生产线进行改善时&#xff0c;常见的做法是对现有的生产线进行绘制各工站的工时山积表如下圖所見&#xff0c;然后对各工站的动作单元进行ECRS 改善。 E&#xff1a;不需要的可进行 Eliminate &#xff08;取消&…

Telegraf-Influxdb-Grafana容器化部署拓展(Https、AD域、告警集成)并监控Cisco设备指标

前言&#xff1a; 还记得在去年的笔记中提到过使用python的pysnmp模块&#xff0c;配合Influxdb&#xff0c;Grafana收集Cisco设备指标。链接如下&#xff1a;https://blog.csdn.net/tushanpeipei/article/details/117329794 。在该实例中&#xff0c;我们通过python编写脚本收…

第一节 Maven核心程序解压与配置

1、Maven 官网地址 首页&#xff1a; Maven – Maven Repositories (apache.org)https://maven.apache.org/repositories/index.html下载页面&#xff1a; Maven – Download Apache Mavenhttps://maven.apache.org/download.cgi下载链接&#xff1a; 具体下载地址&#xff…

【微信小程序】列表渲染wx:for

&#x1f3c6;今日学习目标&#xff1a;第十二期——列表渲染wx:for &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;20分钟 &#x1f389;专栏系列&#xff1a;我的第一个微信小程序 文章目录前言效果图< block…

同花顺_代码解析_交易系统_J01_08

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 J_01 MACD系统 J_02 布林带系统 J_03 趋向指标 J_04 乖离系统 J_05 KDJ系统 J_07 容量比率系统 J_08 威廉系统 J_01 MACD系统 分析MACD柱状线&#xff0c;由绿变红(负变正)&…