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。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章: