java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 定时器和多线程

java中的定时器和多线程

作者:罗思洋

这篇文章主要介绍了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。

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

您可能感兴趣的文章:
阅读全文