java中的定时器和多线程

 更新时间:2024年01月16日 10:22:47   作者:罗思洋  
这篇文章主要介绍了java中的定时器和多线程用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

定时器和多线程

1、任务简介

本文分享的是杜老师《工程训练》任务2.3中的普通任务,通过该任务我们可以初步学习Java中定时器与多线程的相关知识,该任务我是在5月完成的,但是一直未将该部分任务上传,故今天对该部分任务的学习进行叙述,详细的思路和代码在下文中进行分享。

2、基本任务和代码

(1)任务1

  • 1)任务内容

完成一个java application应用程序,使用定时器编程,在实时显示当前时间,每1秒时钟内容更新一次。

  • 2)任务代码

我首先需要了解java定时器的作用,在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等,对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类,即使用java定时器,其中Timer有两个核心的属性,一个是TaskQueue对象,用于存储任务队列,一个是TimerThread,用于执行队列中的任务;

要运行一个定时任务,最基本的步骤如下:首先建立一个要执行的任务TimerTask,然后创建一个Timer实例,通过Timer提供的schedule()方法,将 TimerTask加入到定时器Timer中,同时设置执行的规则即可,当程序执行了Timer初始化代码后,Timer定时任务就会按照设置去执行;

对于Timer中的schedule()方法及其语句的详解

如下图所示:

这里写图片描述

对于系统当前时间的定义方法在任务1.3中已经学习过了,可以借鉴任务1.3的格式来定义当前的系统时间,在对Timer方法进行了简单的学习之后,我准备使用Myeclipse编写程序来实现任务所要求的功能

代码如下:

//每1S刷新显示当前系统时间
import java.text.SimpleDateFormat;//导入java.text包下的SimpleDateFormat类
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
//import java.util.*;//导入java.util包下的所有类
public class Timer1 {//类名
    public static void main(String[] args){//程序主函数
        Timer time=new Timer();//创建一个Timer类的实例
        MyTask task=new MyTask();//创建一个MyTask类的实例
        time.schedule(task, 0,1000);//指定无延迟的运行,并且刷新时间为1S
    }
}
class MyTask extends TimerTask{//创建一个MyTask类继承于父类TimerTask
    public void run(){//run方法,里面包含需要执行的任务
        SimpleDateFormat simpleDateFormat=null;//初始化当前时间
        //获取当前时间信息,并定义其格式
        SimpleDateFormat t=new SimpleDateFormat("yyyy-MM-dd"+"  "+"HH:mm:ss");
        String a=t.format(new Date());//将当前时间信息赋给变量a
        System.out.println("当前系统时间为:"+a);//输出当前时间信息
    }
}
  • 3)运行结果

(2)任务2

  • 1)任务内容

完成一个java application应用程序,在应用程序主进程中新开一个线程,此线程进行死循环,每1秒被激活一次,激活时即在输出显示当前时间。

  • 2)任务代码:

在对定时器的知识进行学习之后,我们需要学习java中多线程的知识,Java 给多线程编程提供了内置的支持,一条线程指进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务,用多线程只有一个目的,那就是更好的利用CPU的资源,而每一个线程都有自己的生命周期,如下图所示:

Java 提供了三种创建线程的方法:

1、通过实现 Runnable 接口;

2、通过继承 Thread 类本身;

3、通过 Callable 和 Future 创建线程;我本次编写程序选择使用继承Thread 类创建线程,每隔1S激活一次,并显示当前的系统时间,程序代码如下:

import java.text.SimpleDateFormat;//导入java.text包下的SimpleDateFormat类
import java.util.Date;//导入java.util包下的Date类
public class Timer2 {//类名
    public static void main(String[] args) {//程序主函数
        Thread t=new Thread();//创建一个新的线程
        date d=new date();//创建一个date类对象
        d.start();//开启线程
    }
}
class date extends Thread{//创建一个date类继承于父类Thread
    public void run(){//run方法,里面包含需要执行的任务
        while (true){//定义死循环
            try{//try代码块,当发生异常时会转到catch代码块中
                Thread.sleep(1000);//死循环中的线程每隔一秒激活一次
                SimpleDateFormat simpleDateFormat=null;//初始化当前时间
                //获取当前时间信息,并定义其格式
                SimpleDateFormat d=new SimpleDateFormat("yyyy-MM-dd"+"  "+"HH:mm:ss");
                String a=d.format(new Date());//将当前时间信息赋给变量a
                System.out.println("当前系统时间为:"+a);//输出当前时间信息
            }
            catch(InterruptedException e){//当try代码块有异常时转到catch代码块
            }
        }
    }
}
  • 3)运行结果

(3)任务3

  • 1)任务内容

完成一个java application应用程序,此应用程序公共类有一个double型类属性(变量)x,初始值为0;在应用程序主进程中新开两个线程,这两个线程都进行死循环;第1个线程每隔300ms激活一次,令类属性x自加1.0并输出显示;第2个线程每隔400ms激活一次,令类属性x自加0.1并输出显示。

  • 2)任务代码

前一个步骤中只使用了一个线程来执行任务,而在本步骤中需要创建两个线程来同时执行任务,故真正需要使用到多线程的知识,分别对两个线程进行定时,并在每次激活后对x进行输出,并且在指定时间间隔后输出一次x的值;

对于该程序中的两个线程我需要分别通过Runnable接口来创建,并使它们在规定的激活间隔后轮流对x进行加法操作,并在每次操作后都要输出x的值,其中需要使用语句Thread a=new Thread(new AThread());来分别创建新的线程类,程序代码如下所示:

public class Timer3{//类名
   static double x=0; //定义一个浮点型变量并赋值
   public static void main(String[] args){//程序主函数
       Thread a=new Thread(new AThread());//建立一个新的线程的对象,这里只能引用静态的方法
       Thread b=new Thread(new BThread());//建立一个新的线程的对象,这里只能引用静态的方法
       System.out.println("初值:"+x);//输出浮点型变量x的初值
       a.start();//开启线程a
       b.start();//开启线程b
       }
public static class AThread implements Runnable{//通过实现Runnable接口来创建线程类
    public void run(){//run方法,里面包含需要执行的任务
        try{//try代码块,当发生异常时会转到catch代码块中
            while(true){//定义死循环
                Thread.sleep(300);//死循环中的线程每300ms激活一次
                x+=1;//x=x+1
                System.out.println("线程1:"+x);//在控制台输出x
                }
            }
        catch(InterruptedException e){}//当try代码块有异常时转到catch代码块
        }
    }
public static class BThread implements Runnable{//通过实现Runnable接口来创建线程类
    public void run(){//run方法,里面包含需要执行的任务
        try{//try代码块,当发生异常时会转到catch代码块中
            while(true){//定义死循环
                Thread.sleep(400);//死循环中的线程每400ms激活一次
                x+=0.1;//x=x+0.1
                System.out.println("线程2:"+x);//在控制台输出x
                }
            }
        catch(InterruptedException e){}//当try代码块有异常时转到catch代码块
        }
    }
}
  • 3)运行结果

总结

本文简单介绍了Java中定时器和多线程编程的一些例子,大家可以在普通任务的基础上尝试进行挑战任务,特别是将普通任务3修改为挑战任务1。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • SpringBoot @Configuration与@Bean注解使用介绍

    SpringBoot @Configuration与@Bean注解使用介绍

    这篇文章主要介绍了SpringBoot中的@Configuration与@Bean注解,在进行项目编写前,我们还需要知道一个东西,就是SpringBoot对我们的SpringMVC还做了哪些配置,包括如何扩展,如何定制,只有把这些都搞清楚了,我们在之后使用才会更加得心应手
    2022-10-10
  • Java Map循环遍历的7种方式与性能对比

    Java Map循环遍历的7种方式与性能对比

    这篇文章主要为大家详细介绍了Java中Map的七种遍历方式,包括entrySet+for-each,keySet+for-each,只遍历value,Iterator+entrySet等,文内分析了每种方式的优缺点和适用场景,希望的可以了解下
    2026-05-05
  • Java实现NIO聊天室的示例代码(群聊+私聊)

    Java实现NIO聊天室的示例代码(群聊+私聊)

    这篇文章主要介绍了Java实现NIO聊天室的示例代码(群聊+私聊),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • java Scanner类的使用示例代码

    java Scanner类的使用示例代码

    这篇文章主要介绍了java Scanner类的使用,Scanner类还可以任意地对字符串和基本类型(如int和double)的数据进行分析。借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • 深入浅出了解happens-before原则

    深入浅出了解happens-before原则

    一提到happens-before原则,就让人有点“丈二和尚摸不着头脑”。这个涵盖了整个JMM中可见性原则的规则,究竟如何理解,把我个人一些理解记录下来。下面可以和小编一起学习
    2019-05-05
  • Java中的xxl-job调度器线程池工作机制

    Java中的xxl-job调度器线程池工作机制

    xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠任务执行,本文给大家介绍Java: xxl-job调度器线程池工作机制,感兴趣的朋友一起看看吧
    2025-07-07
  • 深入理解@component与@Configuration注解

    深入理解@component与@Configuration注解

    这篇文章主要介绍了深入理解@component与@Configuration注解,从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被扫描,并用于构建bean定义,初始化Spring容器,需要的朋友可以参考下
    2023-11-11
  • 你都理解创建线程池的参数吗?

    你都理解创建线程池的参数吗?

    这篇文章主要介绍了创建线程池参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Springboot实例讲解实现专业材料认证管理系统流程

    Springboot实例讲解实现专业材料认证管理系统流程

    这是一个基于java的毕业设计项目,毕设课题为springboot框架的知识产权服务平台系统,是一个采用b/s结构的javaweb项目,需要的朋友可以参考下
    2022-06-06
  • java读取excel文件为base64实现方式

    java读取excel文件为base64实现方式

    文章介绍使用ApachePOI和EasyExcel处理Excel文件并转换为Base64的方法,强调EasyExcel适合大文件且内存占用低,需注意文件格式支持、流关闭、Base64编码方式选择及常见问题处理,如乱码、文件损坏等,同时建议优化性能时采用分块读取
    2025-09-09

最新评论