定时器和多线程

定时器和多线程

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)运行结果
这里写图片描述

3、总结

本博客简单介绍了Java中定时器和多线程编程的一些例子,大家可以在普通任务的基础上尝试进行挑战任务,特别是将普通任务3修改为挑战任务1,对于本文程序中的不足之处恳请大家指正。

猜你喜欢

转载自blog.csdn.net/lsylsy726/article/details/82115692