java多线程-定时器-并发与并行-线程生命周期(代码片段)

学全栈的灌汤包 学全栈的灌汤包     2023-04-05     696

关键词:

文章目录

多线程补充

定时器

定时器介绍:

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

作用:闹钟、定时邮件发送。

定时器实现方式:

方式一:Timer

方式二: ScheduledExecutorService

Timer定时器构造器和方法如下:

构造器说明
public Timer()创建Timer定时器对象
public static void main(String[] args) 
    // 创建一个定时器任务
    Timer timer = new Timer();

方法说明
schedule(TimerTask task, long delay, long period)开启一个定时器,按照计划处理TimerTask任务

参数一: 延时执行的任务

参数二: 延迟的时间

参数三: 每隔多少时间执行一次(不传参数三表示只延迟执行一次)

public static void main(String[] args) 
    // 创建一个定时器任务
    Timer timer = new Timer();

    // 调用方法处理定时任务, 延迟执行三秒后每隔两秒执行一次
    timer.schedule(new TimerTask() 
        @Override
        public void run() 
            System.out.println(Thread.currentThread().getName() + "执行一次");
        
    , 3000, 2000);

Timer定时器的特点和存在的问题

Timer是单线程,处理多个任务按照顺序执行(意味着多个定时器会在一个线程中依次执行, 定时任务就会相互影响),存在延时与设置定时器的时间有出入。

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


ScheduledExecutorService定时器:

ScheduledExecutorService是 jdk1.5中引入了并发包,目的是为了弥补Timer的缺陷, ScheduledExecutorService内部为线程池。

Executors的方法说明
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)得到线程池对象
ScheduledExecutorService的方法说明
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)周期调度方法

演示代码:

public static void main(String[] args) 
    // 创建ScheduledExecutorService线程池做定时器
    ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);

    // 开启定时任务
    pool.scheduleAtFixedRate(new TimerTask() 
        @Override
        public void run() 
            System.out.println(Thread.currentThread().getName() + "执行输出AAA");
        
    , 0, 2, TimeUnit.SECONDS);

    // 多个定时器任务之间不会相互影响
    pool.scheduleAtFixedRate(new TimerTask() 
        @Override
        public void run() 
            System.out.println(Thread.currentThread().getName() + "执行输出BBB");
        
    , 0, 2, TimeUnit.SECONDS);

ScheduledExecutorService的优点:

基于线程池,某个任务的执行情况不会影响其他定时任务的执行。

并发和并行

并发与并行:

正在运行的程序(软件)就是一个独立的进程, 线程是属于进程的,多个线程其实是并发与并行同时进行的

并发的理解:

CPU同时处理线程的数量有限。

CPU会轮流为系统的每个线程服务,由于CPU切换的速度很快,给我们的感觉这些线程在同时执行,这就是并发。

并行的理解:

在同一个时刻上,有多个线程真正的被CPU同时处理并执行。

线程的生命周期

线程的状态:

线程的状态:也就是线程从生到死的过程,以及中间经历的各种状态及状态转换。

理解线程的状态有利于提升并发编程的理解能力。

Java线程的状态:

Java总共定义了6种状态

6种状态都定义在Thread类的内部枚举类中, 如下:

public class Thread
		...
		public enum State 
				NEW,
				RUNNABLE,
      	BLOCKED,
      	WAITING,
      	TIMED_WAITING,
      	TERMINATED;
		
		...

线程中6种状态相互转换如下:

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

java多线程并发02——线程的生命周期与常用方法

线程生命周期一个线程不是被创建了马上就开始执行,也不是一直处于执行状态。在线程的整个生命周期中会经历新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和销毁(Terminated)5种状态。线程全生命周期.PNG新... 查看详情

高并发多线程之线程基础中生命周期线程封闭cpu缓存(代码片段)

前言本篇文章主要介绍线程的基础,什么是线程、线程的状态、线程封闭、cpu缓存和内存屏障、指令重排等概念什么是java线程 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程... 查看详情

java并发系列-----多线程简介创建以及生命周期(代码片段)

进程、线程与任务进程:程序的运行实例。打开电脑的任务管理器,如下:正在运行的360浏览器就是一个进程。运行一个java程序的实质是启动一个java虚拟机进程,也就是说一个运行的java程序就是一个java虚拟机进程。进程是程... 查看详情

Java多线程并发与并行

】Java多线程并发与并行【英文标题】:Javamulti-threadingConcurrencyvsParallelism【发布时间】:2021-12-1215:24:24【问题描述】:嗨,全世界的程序员为了了解并发与并行之间的区别,我得到了这个问题来解决,但是我在这个我无法解决的... 查看详情

java线程(jvm层面)的生命周期

在Java领域,实现并发程序的主要手段就是多线程。线程是操作系统里的一个概念,Java语言里的线程本质上就是操作系统的线程,它们是一一对的。通用的线程生命周期(在操作系统调度层面)Java线程(JVM层面)的生命周期可以... 查看详情

javalearn#(13)多线程:线程生命周期线程控制线程同步线程通信线程池forkjoin框架(代码片段)

1.进程和线程程序:一段静态的代码,是应用程序执行的蓝本进程:指一种正在运行的程序,有自己的地址空间动态性(正在运行的程序)并发性(同时运行)独立性(QQ和微信互不干扰)并... 查看详情

java中多线程并发并行线程与进程线程调度创建线程的方式(代码片段)

多线程:多线程比单线程快,前面简单介绍过:集合如果是不安全的,那么它就是多线程的,了解多线程之前,先了解什么是并发和并行。并发:指两个或多个事件在同一个时间段内发生。并行:... 查看详情

java---多线程篇(代码片段)

多线程进程与线程并行与并发多线程的创建和启动Thread类创建线程的两种方式方式一:继承Thread类方式二:实现Runnable接口指定线程的名称,并获取继承方式和实现方式的联系和区别Thread类相关的方法1线程的优先级Thr... 查看详情

java并发常见面试题总结(上)(代码片段)

Java并发常见面试题总结--上什么是线程和进程?何为进程?何为线程?请简要描述线程与进程的关系,区别及优缺点?图解进程和线程的关系程序计数器为什么是私有的?虚拟机栈和本地方法栈为什么是私有的?一句话简单了解堆和... 查看详情

java多线程基础--线程生命周期与线程协作详解(代码片段)

前言各位亲爱的读者朋友,我正在创作Java多线程系列文章,本篇我们将梳理基础内容:线程生命周期与线程协作这是非常基础的内容,本篇仅从知识完整性角度出发,做一次梳理。作者按:本篇按照自己... 查看详情

java多线程基础--线程生命周期与线程协作详解(代码片段)

前言各位亲爱的读者朋友,我正在创作Java多线程系列文章,本篇我们将梳理基础内容:线程生命周期与线程协作这是非常基础的内容,本篇仅从知识完整性角度出发,做一次梳理。作者按:本篇按照自己... 查看详情

java中的线程

目录​​线程​​​​一个线程的生命周期​​​​线程的创建与启动​​​​线程的终止​​​​线程的同步机制​​​​线程的通知机制​​线程一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程... 查看详情

day829.java线程的生命周期-java并发编程实战(代码片段)

Java线程的生命周期Hi,我是阿昌,今天学习记录的是关于Java线程的生命周期的内容。在Java领域,实现并发程序的主要手段就是多线程。线程是操作系统里的一个概念,虽然各种不同的开发语言如Java、C#等都对其... 查看详情

day829.java线程的生命周期-java并发编程实战(代码片段)

Java线程的生命周期Hi,我是阿昌,今天学习记录的是关于Java线程的生命周期的内容。在Java领域,实现并发程序的主要手段就是多线程。线程是操作系统里的一个概念,虽然各种不同的开发语言如Java、C#等都对其... 查看详情

并行是什么意思?与并发的区别是什么?

...生多个事件。2、并行没有对CPU资源的抢占;并发执行的线程需要对 CPU资源进行抢占。3、并行执行的线程之间不存在切换;并发操作系统会根据任务调度系统给线程分配线程的CPU执行时间,线程的执行会进行切换。 Java中... 查看详情

高并发线程的生命周期其实没有我们想象的那么简单!!(代码片段)

写在前面在【高并发专题】中的《高并发之——线程与多线程》一文中,我们简单介绍了线程的生命周期和线程的几个重要状态,并以代码的形式实现了线程是如何进入各个状态的。今天,我们就结合操作系统线程和编程语言线... 查看详情

线程生命周期与创建线程的多种方式(代码片段)

目录前言一、线程的生命周期(重点)二、实现多线程的多种方式2.1继承Thread类并重写run方法2.2实现Runnable接口并重写run方法补充:另外两种线程创建方式前言最近读完了《深入理解Java虚拟机》大部分理论章节,... 查看详情

并发与多线程相关知识点梳理

文章目录并发和并行的概念如何保证线程安全1.数据单线程内可见2.只读对象3.线程安全类4.同步与锁机制什么是锁线程同步引用类型ThreadLocalLeetCode相关线程的练习本文总结了并发与多线程相关知识点,做一个小结。并发和并... 查看详情