Java多线程示例与定时任务实现

SpringBoot 中实现定时任务的几种方式 这种方式很简单,主要就是先@EnableScheduling开启定时任务功能,然后在相应的方法上添加@Scheduled()中间写上相应的cron表达式即可。示例如下:schedule.ScheduleTask: Cron表达式参数参考:建议:直接在线生成Cron表达式比较方便:www.matools.com/cron/@Scheduled:除了支持灵活的参数表达式cron之外,还支持 fixedDelay,fixedRate,initialDelay 这些延时性的操作。启动测试就实现了基本的定时任务功 阅读详情

目录

一、概述

二、Java多线程实现常用方法

1. 继承Thread

2. 重写Runnable接口

3. 线程池

 三、利用线程池实现定时任务


一、概述

线程(thread):一个程序内部的一条执行路径

单线程:程序中只有一条执行路径

多线程(multithreading):实现多条执行流程的技术

多线程优点:更好地利用cpu的资源;改善程序的结构;将复杂的进程分为多个线程独立运行,利于理解和维护;提高应用程序的响应能力

定时任务:任务体可以定时执行(延迟执行,定时执行,定期循环执行)

二、Java多线程实现常用方法

1. 继承Thread

步骤:继承thread--》重写run方法--》创建线程对象--》调用start方法启动

说明:编程简单,存在单继承的局限性

示例:

public class ThreadTest {
    
    public static void main(String[] args) {
        
        // 实现方式1---继承Thread
        TaskForExt taskForExt1 = new TaskForExt();
        TaskForExt taskForExt2 = new TaskForExt();
        taskForExt1.start();
        taskForExt2.start();
        
    }
    
}


/**
 * 继承thread
 */
class TaskForExt extends Thread{

    /**
     * 重写run方法
     */
    @Override
    public void run(){
          
        for(int i=0; i<3; i++){
            System.out.println(Thread.currentThread().getName()+"===>"+i);
        }
    }
}

输出:(多线程同步执行,打印顺序不固定)

Thread-0===>0
Thread-1===>0
Thread-1===>1
Thread-0===>1
Thread-1===>2
Thread-0===>2

2. 重写Runnable接口

步骤:实现runnable--》重写run方法--》创建线程对象--》调用start方法启动

(还可以使用匿名内部类简化代码)

说明:创建过程稍微复杂一点点,扩展性好

示例:

public class ThreadTest {
    
    public static void main(String[] args) {
        
         // 实现方式2---实现Runnable
         Runnable taskForImpl = new TaskForImpl();
         Thread t1 = new Thread(taskForImpl);
         Thread t2 = new Thread(taskForImpl);
         t1.start();
         t2.start();
        
    }
    
}


/**
 * 实现Runnable
 */
class TaskForImpl implements Runnable{

    /**
     * 重写run方法
     */
    @Override
    public void run(){
        
        for(int i=0; i<3; i++){
            System.out.println(Thread.currentThread().getName()+"===>"+i);
        } 
    }
    
}

输出:(多线程同步执行,打印顺序不固定)

Thread-0===>0
Thread-1===>0
Thread-0===>1
Thread-1===>1
Thread-0===>2
Thread-1===>2

3. 线程池

线程池:可以复用线程的技术

方式1:通过ExecutorService的实现类ThreadPoolExecutor创建线程池对象

方式2:使用Executors工具类的不同方法创建不同类型线程池对象

在线程池里执行Runnable任务

示例:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadTest {
    
    public static void main(String[] args) {

        // 实现方式3---线程池
        // 参数:int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue
        ExecutorService pool = new ThreadPoolExecutor(2, 5, 6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5));
        Runnable target = new TaskForImpl();
        pool.execute(target);
        pool.execute(target);
        
    }
    
}


/**
 * 实现Runnable
 */
class TaskForImpl implements Runnable{

    /**
     * 重写run方法
     */
    @Override
    public void run(){
        
        for(int i=0; i<3; i++){
            System.out.println(Thread.currentThread().getName()+"===>"+i);
        } 
    }
    
}

输出:(多线程同步执行,打印顺序不固定)

pool-1-thread-2===>0
pool-1-thread-1===>0
pool-1-thread-2===>1
pool-1-thread-1===>1
pool-1-thread-1===>2
pool-1-thread-2===>2

 三、利用线程池实现定时任务

  • 使用Executors工具类的newScheduledThreadPool方法创建线程池对象
  • 调用线程池的scheduleAtFixedRate方法创建定时任务

示例:

任务1(线程A),延迟1秒执行,每5秒循环一次

任务2(线程B),延迟3秒执行,每5秒循环一次

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

public class PoolTask {

    public static void main(String[] args) {

        // 创建核心线程数量为2的线程池
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);

        // 任务1,延迟1秒执行,每5秒循环一次
        pool.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {

                System.out.println(Thread.currentThread().getName()+"线程A   "+new Date());
            }
        },1,5, TimeUnit.SECONDS);

        // 任务2,延迟3秒执行,每5秒循环一次
        pool.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                
                System.out.println(Thread.currentThread().getName()+"线程B   "+new Date());
            }
        },3,5, TimeUnit.SECONDS);

        // 关闭线程池
        // pool.shutdown();
        
    }
}

输出:

pool-1-thread-1线程A   Wed Jul 20 10:17:59 CST 2022
pool-1-thread-2线程B   Wed Jul 20 10:18:01 CST 2022
pool-1-thread-1线程A   Wed Jul 20 10:18:04 CST 2022
pool-1-thread-2线程B   Wed Jul 20 10:18:06 CST 2022
pool-1-thread-1线程A   Wed Jul 20 10:18:09 CST 2022
pool-1-thread-2线程B   Wed Jul 20 10:18:11 CST 2022

Java多线程————定时器 定时器 多线程 阅读详情

相关推荐

Java多线程(八)定时任务线程池源码

定时任务线程池的工作机制

qq_44818304的博客 1005

定时任务&多线程-springboot

springboot中使用定时任务、多线程。

前后端分离,人不分离! 7637

基于cat12和SPM12进行VBM&SBM数据分析笔记1——数据预处理

基于cat12数据分析基础教程笔记 今年是小编步入研究生生活的第一年,研究方向待定,但主要以磁共振成像为主,以后会不断地总结这方面的知识,涉及MRI扫描,数据分析基础方法理论,软件操作教程,文献阅读笔记总结等等,用来记录我的研究生三年学习过程。编写尽量简洁明了,通俗易懂,本就是小白,也能体会小白的痛。不过这也要谢谢一个人手动@小白(网名),是他教我要把自己所学的写下来,讲出来才能真正的做到输入和输出,查漏补缺。而cat12软件操作是我面临的第一个数据分析的训练,写的可能也不会非常到位,还望各位专业人士指出改

Sophia2023的博客 4万+

java多线程之定时器

定时功能在java中主要是通过Timer类实现,因为它在内部还是使用多线程的方式进行处理,所以和多线程技术还是有非常大的管理该方法的作用是在指定的日期执行一次某一任务执行任务的时间晚于当前时间(在未来执行)的效果如果Data time,该参数的时间晚于现在的时间就是未来执行,而该参数的时间早于现在的执行就是立即执行的意思测试代码如下System . out . println("当前时间为:" + nowTime);

qq_43456605的博客 2353

AI驱动全栈开发实战:基于Spec与Codex的规格驱动开发指南

1. 先搞清楚“AI重构前端全栈”到底在解决什么实际问题 最近很多人在聊“AI重构前端全栈”,听起来像是又一个营销概念。但如果你真的拆开看,它核心解决的是一个非常具体且痛苦的问题: 一个开发者,如何从零开始,系统性地、不跑偏地完成一个完整项目,并且保证代码质量和架构一致性。 传统开发流程里,产品经理出PRD,前后端开会对齐,前端画页面,后端写接口,测试再介入。这个过程沟通成本高,文档容易过时,新人上手慢。而“AI重构”的思路,是试图用一套 规范化的指令(Spec) 来驱动AI(比如Codex这类模型)生成代

weixin_30596023的博客 460

Visual Studio 2022 社区版安装指南:从下载到配置的完整流程

本文详细介绍了Visual Studio 2022社区版的完整安装与配置流程,包括系统要求检查、官方下载步骤、工作负载选择、安装位置配置等关键环节。作为微软推出的免费集成开发环境,VS2022社区版支持多种编程语言,适合个人开发者和小型团队使用。文章还提供了常见问题解决和性能优化技巧,帮助用户高效完成开发环境搭建。

weixin_28829339的博客 892

Java中的定时任务

Java中的定时任务 每天点滴努力,成就编程路! 定时任务,就是一段程序在某个时间内启动起来。它可以用来统计数据,移动数据,发通知,相当于一个闹钟。 下面列举几种跑定时任务的写法 静态定时任务 package com.sise.demo1.demo.common.config; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.E

遥不可及的博客 357

C++ int转四字节数组

字节转换

我不是码农的博客~~~ 974

java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务

java项目中如何利用多线程实现一个定时器任务发布时间:2020-11-10 16:04:03来源:亿速云阅读:86作者:Leah今天就跟大家聊聊有关java项目中如何利用多线程实现一个定时器任务,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在Java中Timer是java.util包中的一个工具类,提供了定时器的功能。我们可以创建一个Ti...

weixin_35701747的博客 1098

XCP实战系列介绍09-基于Vehicle Spy进行XCP测量步骤详解

详细介绍如何使用Vehicle Spy进行XCP测量

initiallizer的博客 1394

我的AI个人公司成立:基于Skills与Qwen大模型的智能问答平台实战开发+龙虾团队

微学AI推出数字员工矩阵,包含10个核心AI角色(总经理、秘书、工程师等),每个角色具备专属技能模块。系统采用FastAPI+Vue3技术栈,核心功能包括:基于SkillLoader的动态技能管理(支持脚本执行和文档加载)、WebSocket流式输出、多轮对话上下文管理。通过模块化架构实现AI自驱协作,可自主完成从需求分析到开发落地的全流程。项目亮点在于声明式技能配置和实时交互能力,打破传统办公壁垒,提升工作效率。

微学AI的博客 1630

基于实现Runnable接口的java多线程

Java多线程通常可以通过继承Thread类或者实现Runnable接口实现。本文主要介绍实现Runnable接口的java多线程的方法, 并通过ThreadPoolTaskExecutor调用执行,以及应用场景。

xingyuemengjin的博客 428

python爬虫项目(一百九十八):电商平台用户行为数据分析与推荐系统、爬取电商平台用户行为数据

本文详细介绍了如何通过爬虫技术抓取电商平台的用户行为数据,并结合数据分析技术,构建一个简单的推荐系统。使用Selenium模拟用户操作抓取动态网页数据,并通过API接口直接获取用户行为数据,能够为后续的用户行为分析提供基础数据。我们结合了基于用户协同过滤、基于商品协同过滤和矩阵分解等方法,构建了不同的推荐系统。实际应用中,可以进一步优化推荐算法,利用更复杂的深度学习技术和更高效的数据处理方法,提升推荐的准确性和个性化程度。

斌擎科技 2362

SpringBoot三种方式实现定时任务

SpringBoot三种方式实现定时任务 定时任务实现的三种方式: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。 ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。 Spring Task:Spring3

飞奔的小强 311

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

定时任务的使用-java

java中的定时任务 在文章的开头,我们先来了解一些定时任务的概念,定时任务表示的是在规定的时间开始执行一定的任务,这理解起来也是比较通俗易懂的,下面我们来介绍一下java中为我们提供的定时任务的实现。 1、Timer和TimerTake 2、ScheduledExecutorService 3、第三方的Quartz框架。 Timer和TimerTask Timer和TimerTask是java.util包下为我们提供的定时任务调度类,下面通过一个简单的列子来了解它的使用。 public st

weixin_40925093的博客 303

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java新建下载任务_Java下SpringBoot创建定时任务详解

序言使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式:一、基于注解(@Scheduled)二、基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了。三、基于注解设定多线程定时任务一、静态:基于注解基于注解@Scheduled默认为单线程,开启多个任务...

weixin_33980343的博客 232

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java线程池实现秒杀功能

1、简单实例 【实例】Java使用多线程和Redis实现一个1000人秒杀100部手机的实例。 (1)秒杀实现(SecondKill.java):创建多线程,并利用Redis的事务功能,实现秒杀功能。 package com.pjb.seckill; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; import java.util.List; /** * 秒杀抢购 * @author pan_

pan_junbiao的博客 3735

spring boot 定时任务

常见定时任务: 1、常见定时任务 Java自带的java.util.Timer类 timer:配置比较麻烦,时间延后问题 timertask:不推荐 2、Quartz框架 配置更简单 xml或者注解 3、SpringBoot使用注解方式开启定时任务 ...

保持饥渴、好奇 351

spring定时任务.线程池,自定义多线程配置

定时任务及多线程配置xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns...

WGH100817的博客 191

Java中定时任务的实现:Timer与ScheduledExecutorService

本文转载自:https://blog.youkuaiyun.com/guozebo/article/details/51090612前言在做后台任务的时候经常需要实现各种各种的定时的,周期性的任务。比如每隔一段时间更新一下缓存之类的。通常周期性的任务都可以使用如下方式实现:[java] view plain copyclass MyTimerThread extends Thread {      @Over...

wwe4023的博客 977

【Java】白话说Java多线程篇(四),生产者/消费者模式与定时任务

【Java】白话说Java多线程篇(四),生产者/消费者模式与定时任务 文章目录【Java】白话说Java多线程篇(四),生产者/消费者模式与定时任务线程并发协作(生产者/消费者模式)定时任务java.util.Timerjava.util.TimerTask 线程并发协作(生产者/消费者模式) 线程并发协作(也叫线程通信),通常用于生产者/消费者模式,情景如下: 生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件。 对于生产者,没有生产产品之前,消费者要进入等待状态。而生产了产品之后

GengMS的博客 620

Timer和TimerTask: Java中定时任务的使用

java当中提供了Timer和TimerTask为我们提供定时任务。

qq_44371305的博客 524

Java编程那些事儿96——多线程使用示例1

Java编程那些事儿96——多线程使用示例1 陈跃峰 出自:http://blog.youkuaiyun.com/mailbomb 12.3 多线程使用示例 多线程技术对于初学者来说,是编程思维的一种跳跃,在实际学习时,一定要熟悉线程的基础知识,掌握线程的实现方式,然后就是开始大量的进行实践,从实践中领悟线程编程的奥妙以及实现的原理。 下面通过几个常见的例子演示多线程的基本使用。 12.3...

insertyou 137

springboot 使用 定时任务

springboot 中 部分定时任务的使用

Fengent的博客 349

java多线程并发之旅-25-Timer 定时执行类详解

Timer 如果我们想定时执行一个任务,应该怎么做呢? Timer 就是一个 Java 提供的类。 入门例子 测试代码 import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TimerTest { ...

1万+
上一篇: Ubuntu/Linux系统Redis安装配置流程
kurtosis_Wu
博客等级 码龄7年 1097粉丝 4原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值