Java#35(多线程扩展)

news2024/12/25 1:32:49

目录

一.定时器

定时器是一种控制任务延时调用, 或者周期调用的技术

1.Timer定时器(不推荐)

2.ScheduledExecutorService定时器(推荐)

二.并发与并行

三.线程状态


一.定时器

定时器是一种控制任务延时调用, 或者周期调用的技术

1.Timer定时器(不推荐)

代码示范: 

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimerDemo1 {
    public static void main(String[] args) {
        Timer time1 = new Timer();//定时器本身就是一个多线程
        //schedule(TimerTask task,//任务
        //         long delay,//延时时间
        //         long period)//周期时间
        time1.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"输出了..."+new Date());
            }
        },2000,3000);
        Timer time2 = new Timer();//定时器本身就是一个多线程
        time2.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"输出了:::"+new Date());
            }
        },2000,3000);
    }
}

结果展示: 

Timer定时器的特点和存在的问题
(1) Timer是单线程,处理多个任务按照顺序执行,存在延时与设置定时器的时间有出入

(2) 可能因为其中的某个任务的异常使Timer线程死掉,从而影响后续任务执行

2.ScheduledExecutorService定时器(推荐)

ScheduledExecutorService定时器的内部是线程池

代码示范: 

import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Test1 {
    public static void main(String[] args) {
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);
        //scheduleAtFixedRate(Runnable command,//任务
        //                    long initialDelay,//延时时间
        //                    long period,//周期时间
        //                    TimeUnit unit)//延时时间和周期时间的单位
        pool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "输出了???"+new Date());
            }
        }, 3, 2, TimeUnit.SECONDS);
        pool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "输出了!!!"+new Date());
            }
        }, 3, 2, TimeUnit.SECONDS);

    }
}

结果展示: 

 优点: 基于线程池, 摸个任务的执行情况不会运行其他定时任务的执行

二.并发与并行

并发与并行
正在运行的程序(软件)就是一个独立的进程,线程是属于进程的,多个线程其实是并发与并行同时进行的
并发的理解:
CPU同时处理线程的数量有限
CPU会轮询为系统的每个线程服务,由于CPU切换的速度很快,给我们的感觉这些线程在同时执行,这就是并发

并行的理解:

同一时刻同时在进行

三.线程状态

1.NEW(新建)                    线程刚被创建,但是并未启动
2.Runnable(可运行)          线程已经调用了start()等待CPU调度
3.Blocked(锁阻塞)          线程在执行的时候未竞争到锁对象,则该线程进入Blocked状态
4.Waiting(无限等待)        一个线程进入Waiting状态,另一个线程调用notify或者notifyAll方法才能够唤醒
5.Timed Waiting(计时等待)     同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态, 带有超时参数的常用方法有Thread.sleep 、object.wait
6.Teminated(被终止)     因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡 

注意:调用sleep()方法不会让出锁对象, 但是调用wait()方法会让出锁对象

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

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

相关文章

Microsoft Store无法打开的解决办法【成功解决】

Microsoft Store无法打开解决办法我自己的解决办法其他Bug导致Microsoft Store无法打开的解决办法vpn代理问题使用TLS 1.2其他BUG解决方案成功解决之前我就有安装wsl的想法,但是他要求打开Microsoft Store,我尝试了各种办法,都不行。今天终于…

SpringCloud-全面详解(学习总结---从入门到深化)

​​​​​​​ 微服务架构进化论 单体应用阶段 (夫妻摊位) 在互联网发展的初期,用户数量少,一般网站的流量也很少,但硬 件成本较高。因此,一般的企业会将所有的功能都集成在一起开发 一个单体应用,然后将该单体应用…

Python代码加速100倍,针对Excel自动化处理的加速实战!

并发 vs 并行 说到并发编程,我们先来澄清一下并发 (Concurrency) 和 并行 ( Parallelism)这两个概念,因为这个两个概念的含义是不同的。 并行(Parallelism)指的就是在同一时刻,有两个或两个以上的任务的代码在处理器…

Spring Cloud Ribbon(负载均衡器)介绍及使用

目前主流的负载方案分为以下两种: 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx)。客户端自己做负载均衡&#x…

[附源码]Python计算机毕业设计SSM基于框架的秧苗以及农产品交易网站(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

命令设计模式

一、命令模式 1、定义 命令模式(Command Pattern)是对命令的封装,每一个命令都是一个操作,请求方发出请求要求执行一个操作,接收方收到请求并执行操作。属于行为型设计模式。 命令模式通过在请求与实现之间引入一个抽…

Spring注解开发

1、Spring注解开发 1 注解开发定义Bean对象【重点】 目的:xml配置Bean对象有些繁琐,使用注解简化Bean对象的定义 问题导入 问题1:使用什么标签进行Spring注解包扫描? 问题2:Component注解和Controller、Service、Re…

【指纹识别】指纹识别【含GUI Matlab源码 029期】

⛄一、指纹识别简介 指纹识别技术主要分三个步骤:指纹预处理、特征提取、指纹分类与匹配。 无论是指纹分类还是指纹匹配,都需要提取指纹的有效特征,而特征提取的性能很大程度上要依赖于指纹图像的质量。在实际应用中,由于采集条件和采集设备的因素,采集到的指纹图像…

IBRNet:基于IBR的NeRF

IBRNet: Learning Multi-View Image-Based Rendering 针对问题:使NeRF具有泛化能力 如何做:主要还是针对颜色和密度的预测进行改进(三维重建部分),和NeRF一样,使用的是volume rendering(渲染部…

Vulkan下多线程渲染设计

1 Vulkan 视角下的多线程渲染 首先我们需要从vulkan api的顶层框架上来看一下,它在哪些地方可以让我们并行。 Vulkan API的基本框架 Vulkan不同于Gles只有一个(不被API暴露出来的)单一链条的cmdbuffer处理,它最大的特点是允许多…

阿里巴巴内部:2022年全技术栈PPT分享(架构篇+算法篇+大数据)

我只截图不说话,PPT大全,氛围研发篇、算法篇、大数据、Java后端架构!除了大家熟悉的交易、支付场景外,支撑起阿里双十一交易1682亿元的“超级工程”其实包括以下但不限于客服、搜索、推荐、广告、库存、物流、云计算等。 Java核心…

Linux中裸机串口通信的基本方法

大家好, 今天主要和大家聊一聊,如何使用串口进行通信的方法。 目录 第一:串口的基本简介 第二:UART的特点 ​第三:UART的配置步骤 第一:串口的基本简介 串口又叫做串行接口,通常叫做COM接…

农业灌区量测水流量在线监测系统解决方案-灌区信息化管理系统-灌区水网智慧化

平升电子农业灌区量测水流量在线监测系统解决方案/灌区信息化管理系统/灌区水网智慧化,对灌区的渠道水位、流量、水雨情、土壤墒情、气象等信息进行监测,同时对泵站、闸门进行远程控制,对重点区域进行视频监控,实现了信息的采集、…

Docker系统性入门(五)

文章目录Podman安装&基操pod多架构CI/CD容器安全监控Podman Podman 是 Red Hat 在2018年推出的,源代码开放是一个基于 Linux 系统的 daemon-less 的容器引擎;可以运行在root或者非root用户模式最近总听到这个要代替docker什么的,可以参考…

甲骨文蟾蜍 Toad for Oracle 16.2 注册版

使您的 Oracle 数据库操作现代化以实现业务敏捷性。 Toad for Oracle 是唯一一款可帮助您简化工作流程、减少代码缺陷并提高代码质量和性能同时支持团队协作的开发人员工具。自动化管理任务并主动管理您的数据库,同时实现性能优化和风险缓解。快速轻松地定义、搜索…

硬核干货,带你一文掌握 MySQL 的binlog 、redo log、undo log

​hello,大家好。 在MySQL 中我们经常会接触到三个核心日志,它们分别是:binlog 、redo log、undo log。 好多同学对于它们可能并不陌生,但是具体区分起来各自的功能用途以及实现原理,那可能认知就会比较模糊了&#x…

Web前端开发技术课程大作业_ 关于美食的HTML网页设计——HTML+CSS+JavaScript在线美食订餐网站html模板源码30个页面_

👨‍🎓静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计👩‍🎓,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等,用的最多的还是DW,当然不同软件写出的…

Git基础|配置Git账号信息,Git存储的原理详解【建议收藏】

Git作为分布式版本管理,就需要对用户进行认证,账号名和邮箱,方便开发者从不同的电脑进行登录。同时,要想真的记住Git的命令,也必须要清楚Git的存储、上传原理。 Git基础2一、用户签名1、打开命令界面2、进入到用户管理…

CleanMyMac2023最新版软件功能及使用心得教程

电脑明明有100G,但是只剩下几个G,明明已经清理了很多,但是还是没有释放出内存,怎么办?可以试试CleanMyMac X,怎么使用呢?来看看吧!CleanMyMac X是一款颇受欢迎的专业清理软件&#x…

【2022.12.10】备战春招Day5——每日一题 + 96. 不同的二叉搜索树

【每日一题】1691. 堆叠长方体的最大高度 题目描述 给你 n 个长方体 cuboids ,其中第 i 个长方体的长宽高表示为 cuboids[i] [widthi, lengthi, heighti](下标从 0 开始)。请你从 cuboids 选出一个 子集 ,并将它们堆叠起来。 如…