Java的线程及多线程

news2024/11/20 1:46:21

1 线程

1.1 Thread

下面是两个demo,第一个是线程执行顺序,第二个是多个线程的顺序。

其中线程的start可以看成是就绪状态,cpu并不一定会马上去执行run方法的内容,因此如果是多线程,顺序是不确定的。

public class Thread01 extends Thread{
    public static void main(String[] args) {
        System.out.println("JVM创建main线程执行main方法");

        Thread01 thread01 = new Thread01();
        //调用start()方法来启动线程,实质就是请求JVM运行相应的线程,这个线程具体什么时候运行由OS的线程调度器(Scheduler)决定
        //start()方法调用结束并不意味着子线程开始运行
        //新开启的进行会执行run方法
        //如果开启了多个线程,start()调用的顺序并不一定就是线程的启动顺序!
        //多线程运行结果和代码调用顺序无关
        thread01.start();

        System.out.println("main线程其他的代码...");
    }

    //run()方法的代码就是子线程要执行的任务
    //run()方法执行完线程就执行完了
    @Override
    public void run() {
        System.out.println("这是子线程打印的东西");
    }
}

线程的执行顺序,main方法也是一个线程
在这里插入图片描述

public class Thread02 extends Thread {

    public static void main(String[] args) throws InterruptedException {
        Thread02 thread02 = new Thread02();
        thread02.start();

        for (int i = 0; i < 10; ++i) {
            System.out.println("main thread: " + i);
            long time = (long) (Math.random() * 1000);
            Thread.sleep(time);
        }
    }

    @SneakyThrows
    @Override
    public void run() {
        for (int i = 0; i < 10; ++i) {
            System.out.println("sub thread: " + i);
            long time = (long) (Math.random() * 1000);
            Thread.sleep(time);
        }
    }
}

因为只执行10循环,线程运行很快,循环100次可能都不会出现顺序不同,所以让主线程sleep一会,就可以看到主和子线程交替执行。
在这里插入图片描述

1.2 Runnable和Callable区别

1)Runnable提供run方法,无法通过throws抛出异常,所有CheckedException必须在run方法内部处理。Callable提供call方法,直接抛出Exception异常。

2)Runnable的run方法无返回值,Callable的call方法提供返回值用来表示任务运行的结果。

3)Runnable可以作为Thread构造器的参数,通过开启新的线程来执行,也可以通过线程池来执行。而Callable只能通过线程池执行。

同样顺序不同,可自己运行

public class MyRunnable implements Runnable {

    // 2)重写Runnable接口中的抽象方法run()
    // run()方法就是子线程要执行的代码
    @Override
    public void run() {
        for(int i = 0; i < 10; i++){
            System.out.println("sub thread -> " + i);
        }
    }

    public static void main(String[] args) {
        // 3)创建Runnable接口的实现类对象
        MyRunnable runnable = new MyRunnable();
        // 4)创建线程对象
        Thread t = new Thread(runnable);
        // 5) 启动线程
        t.start();


        for(int i = 0; i < 10; i++)
            System.out.println("main thread -> " + i);
    }
}

2 多线程

主要介绍五种

  • cachedThreadPool():线程池的最大核心线程为无限大,当执行第二个任务时第一个任务已经完成,则会复用执行第一个任务的线程;如果第一个线程任务还没有完成则会新建一个线程。
  • fixedThreadPool(2):创建指定长度的线程池,任务超出当前线程池执行线程数量则会一直等待,直到运行。
  • scheduledThreadPool:支持创建定时线程池,以下案例中延迟2秒后开始执行线程池中的所有任务。
  • singleThreadExecutor:创建一个单线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
  • threadPoolExecutor:详解
public class ThreadPool {

    public static void main(String[] args) {
        // 总结: 线程池的最大核心线程为无限大,当执行第二个任务时第一个任务已经完成,则会复用执行第一个任务的线程;如果第一个线程任务还没有完成则会新建一个线程。
        //cachedThreadPool();
        // 总结:创建指定长度的线程池,任务超出当前线程池执行线程数量则会一直等待,直到运行。
        //fixedThreadPool();
        // 总结:以下案例中延迟2秒后开始执行线程池中的所有任务。
        //scheduledThreadPool();
        // 创建一个单线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
        //singleThreadExecutor();
        threadPoolExecutor();
    }

    public static void cachedThreadPool() {
        // 创建可缓存线程池
        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();

        for (int i = 0; i < 5; i++) {
            //创建任务
            Runnable runnable = () -> {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            };
            newCachedThreadPool.execute(runnable);
        }
    }

    public static void fixedThreadPool() {
        // 创建定长线程池
        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);

        for (int i = 0; i < 5; i++) {
            //创建任务
            Runnable runnable = () -> {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            };
            // 将任务交给线程池管理
            newFixedThreadPool.execute(runnable);
        }
    }

    public static void scheduledThreadPool() {
        // 创建支持定时线程池
        ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(2);

        for (int i = 0; i < 5; i++) {
            //创建任务
            Runnable runnable = () -> System.out.println(Thread.currentThread().getName());
            // 将任务交给线程池管理,延迟2秒后才开始执行线程池中的所有任务
            newScheduledThreadPool.schedule(runnable, 2, TimeUnit.SECONDS);
        }
    }

    public static void singleThreadExecutor() {
        // 创建单线程-线程池,任务依次执行
        ExecutorService newScheduledThreadPool = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 5; i++) {
            //创建任务
            Runnable runnable = () -> System.out.println(Thread.currentThread().getName());
            // 将任务交给线程池管理
            newScheduledThreadPool.execute(runnable);
        }
    }

    public static void threadPoolExecutor() {

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 3, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1024));
        for (int i = 0; i < 5; i++) {
            //创建任务
            Runnable runnable = () -> System.out.println(Thread.currentThread().getName());
            // 将任务交给线程池管理
            threadPoolExecutor.execute(runnable);
        }
    }

}

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

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

相关文章

【Pytorch】第 6 章 :用函数逼近扩展学习

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

【GRU回归预测】基于门控循环单元GRU实现数据多维输入单输出回归预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

英方软件通过注册:预计年营收2亿 为胡军擎与江俊夫妻店

雷递网 雷建平 12月8日上海英方软件股份有限公司&#xff08;简称&#xff1a;“英方软件”&#xff09;日前通过注册&#xff0c;准备在科创板上市。英方软件计划募资5.7亿元&#xff0c;其中&#xff0c;2.46亿元用于行业数据安全和业务连续性及大数据复制软件升级项目&#…

JavaScript:错误处理

一个优秀的产品&#xff0c;需要有一个良好的错误处理策略可以让用户知道到底发生什么。不至于让用户自己不知道发生了什么&#xff0c;然后再重试或者是不至于然用户感到特别厌烦&#xff0c;然后直接离开。 try/catch语句 try/catch语句&#xff0c;在JavaScript中作为处理…

51 java.lang.Class/java.lang.ClassLoader/InstanceKlass/ClassloaderData 的卸载

前言 之前 碰到了一个 flink 基于 ChildFirstClassLoader 来进行任务隔离 导致的内存泄漏的问题 然后 使用 demo 复现了一下 问题 之后 想探索一下 java language 中 类型的卸载相关 并且会 拓展一些其他的知识 以下测试用例基于 jdk8, 部分截图基于 jdk9 测试用例 T…

0行代码拿210万年薪,ChatGPT催生新型「程序员」岗:工作纯靠和AI聊天

梦晨 发自 凹非寺量子位 | 公众号 QbitAI靠玩ChatGPT&#xff0c;还能找到新工作&#xff1f;没错&#xff0c;Riley Goodside&#xff08;后面叫他好面哥&#xff09;4月份开始在网上发布玩GPT-3的心得。最近ChatGPT一波爆火&#xff0c;他不光粉丝涨了一万多&#xff0c;还收…

『 云原生·Docker』Docker中部署Nginx

系列文章目录 本系列主要分为以下六大部分,正在更新中,尽请期待&#xff01; 『 云原生生之门』 『 云原生前置知识』 『 云原生Docker』 『 云原生Kubernetes』 『 云原生KubeSphere』 『 云原生DevOps』 &#x1f6a9;点击关注本专栏 提示&#xff1a;已经更新的或正在更新的…

自动驾驶之MultiPath++论文阅读笔记

预测道路参与者的future behavior. 摘要 将输入由dense image-based encoding改为a sparse encoding of heterogeneous scene elements. 即用polylines(折现)来描述road features和原始的agent state information(例如位置、速度和加速度)。 主要方法是对这些元素进行a conte…

【POJ No. 2778】DNA 序列 DNA Sequence

【POJ No. 2778】DNA 序列 DNA Sequence 北大OJ 题目地址 【题意】 DNA序列是一个只包含A、C、T和G的序列。分析DNA序列片段非常有用&#xff0c;若动物的DNA序列包含片段ATC&#xff0c;则意味着该动物可能患有遗传病。 给定m 个遗传病片段&#xff0c;求有多少种长度为n 的…

自动驾驶两大路线对决,渐进式玩家为何更容易得人心?

HiEV消息&#xff08;文/长海&#xff09;对自动驾驶赛道而言&#xff0c;2022年的冬天格外冷冽。寒潮袭来&#xff0c;从各家的应变方式看&#xff0c;不同路径的玩家呈现“冰火两重天”&#xff0c;进化的趋势也越来越清晰。 以Waymo为代表、持续研发L4级无人驾驶的跨越式路线…

web课程设计网页规划与设计 :DW旅游主题网页设计——凤阳智慧旅游官方-地方旅游网站模板html源码HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

ONES X 华西证券|以需求全流程管控,洞见金融数据价值

近日&#xff0c;ONES 签约全国一流证券金融服务商——华西证券&#xff0c;助推华西证券构建需求全流程管控体系&#xff0c;保障需求任务的上下游衔接与顺畅流转&#xff0c;做到系统内所有数据透明化、线上化、统一化&#xff0c;提高团队协同效率&#xff0c;打破「部门墙」…

所谓“生活的艺术“, 就是悠闲二字

关于作者 作为陈独秀、胡适、鲁迅的同时代人&#xff0c;林语堂是"五四"新文化运动的参与者&#xff0c;中国现 代著名作家、学者、翻译家、语言学家&#xff0c;新道家代表人物。他清晰地看到了关于中国 传统文化观点的两种极端倾向&#xff0c;一种是把 中国传统文…

R语言VAR模型的不同类型的脉冲响应分析

目录 模型与数据 估算值 预测误差脉冲响应 识别问题 正交脉冲响应 结构脉冲反应 广义脉冲响应 参考文献 最近我们被客户要求撰写关于脉冲响应分析的研究报告&#xff0c;包括一些图形和统计输出。脉冲响应分析是采用向量自回归模型的计量经济学分析中的重要一步。它们的…

火爆出圈的ChatGPT,你也来体验一下吧!

最近网络上流行了一个叫ChatGPT的东西&#xff0c;他到底是什么东西&#xff1f; ChatGPT是人工智能实验室OpenAI发布的一款对话式聊天机器人。他可以解答很多刁钻有难度的问题&#xff0c;一经发布就火遍科技圈。12月4日&#xff0c;马斯克在咨询该聊天机器人关于推特经营的建…

构建高性能内存队列:Disruptor 永远滴神~

我们清楚使用锁的性能比较低&#xff0c;尽量使用无锁设计。接下来就我们来认识下Disruptor。 Disruptor简单使用 先简单介绍下&#xff1a; Disruptor它是一个开源的并发框架&#xff0c;并获得2011 Duke’s程序框架创新奖【Oracle】&#xff0c;能够在无锁的情况下实现网络…

单机存储系统可靠性及相关技术介绍

一、存储系统可靠性的影响因素单机存储系统包括存储硬件和存储软件。存储硬件又包含存储介质、存储控制器、设备固件&#xff1b;存储软件栈层次则更为复杂&#xff0c;以Linux为例包括&#xff1a;存储设备驱动层、 块设备层(Block Layer)、可选的虚拟块设备层(Device Mapper)…

新手使用wvp-pro和zlm的菜鸟说明(手把手教)

对于wvp-pro的使用&#xff0c;很多大佬都是白嫖菜鸟党&#xff0c;很多都第一次使用wvp&#xff0c;甚至第一次接触国标&#xff0c;连国标最基本流程都不清楚。所以写此文档以供各位菜鸟大佬点评指正 看此文档前提&#xff1a; 第一&#xff1a;先看三遍zlm和wvp的wiki&…

【光照感知子场:差分感知融合模块与中间融合策略相结合】

PIAFusion: A progressive infrared and visible image fusion network based on illumination aware 本文提出了一种基于光照感知的渐进式图像融合网络PIAFusion&#xff0c;自适应地保持显著目标的亮度分布和背景的纹理信息。具体而言&#xff0c;我们设计了一个光照感知子网…

【Java基础篇】基础知识易错集锦(一)

在学习的路上&#xff0c;我们只记得学习新的知识&#xff0c;却忽略了一切新知识都是在旧知识的基础上&#xff1b;努力奔跑的过程中&#xff0c;也要记得常回头看看&#xff1b; 题目展示&#xff1a; 解析&#xff1a; abstract是抽象的意思&#xff0c;在java中&#xff0…