java中的定时器和多线程

  目录

  定时器和多线程

  1、任务简介

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

  2、基本任务和代码

  (1)任务1

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

  我首先需要了解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);//输出当前时间信息

  }

  }

  (2)任务2

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

  在对定时器的知识进行学习之后,我们需要学习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

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

  前一个步骤中只使用了一个线程来执行任务,而在本步骤中需要创建两个线程来同时执行任务,故真正需要使用到多线程的知识,分别对两个线程进行定时,并在每次激活后对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代码块

  }

  }

  }

  总结

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

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

  您可能感兴趣的文章: