快捷搜索:  as

java定时器和多线程

准时/计划功能在Java利用的各个领域都应用得异常多,比方说Web层面,可能一个项目要准时采集话单、准时更新某些缓存、准时清理一批不生动用户等等。准时计划义务功能在Java中主要应用的便是Timer工具,它在内部应用多线程要领进行处置惩罚,以是它和多线程技巧关联照样相昔时夜的。

一、相关常识进修

1、 Java准时器TImer

用于Java线程里指准光阴或周期运行义务。TImer是线程安然的,但不供给实时性(real-TIme)包管。

schdule措施:

schedule(TImerTask task, long delay)

以当前光阴为基准,延迟指定的毫秒后履行一次TimerTask义务。

schedule(TimerTask task, Date time)

在指定的日期履行一次TimerTask义务。

假如日期time早于当前光阴,则立即履行。

schedule(TimerTask task, long delay, long period)

以当前光阴为基准,延迟指定的毫秒后,再按指定的光阴距离地无限次数的履行TimerTask义务。

schedule(TimerTask task, Date firstTime, long period)

在指定的日期之后,按指定的光阴距离地无限次数的履行TimerTask义务。

scheduleAtFixedRate措施:

scheduleAtFixedRate(TimerTask task, long delay, long period)

以当前光阴为基准,延迟指定的毫秒后,再按指定的光阴距离周期性地无限次数的履行TimerTask义务。

假如日期firstTime早于当前光阴,则立即履行,且不履行在光阴差内的义务。

scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

在指定的日期之后,按指定的光阴距离周期性地无限次数的履行TimerTask义务。

假如日期firstTime早于当前光阴,则急速履行,并弥补性的履行在光阴差内的义务。

2、 Java多线程进修

在java中要想实现多线程,有两种手段,一种是继承Thread类,别的一种是实现Runable接口

java多线程之承袭Thread类创建线程类的步骤如下:

1.创建Thread类的子类,并重写run()措施。

2.创建Thread子类的实例即线程工具3.调用线程工具的start()措施

3.调用线程工具的start()措施

Thread类有以下常用构造措施:

1.Thread()

2.Thread(String name)

3.Thread(Runnable r)

4.Thread(Runnable r,String name)

应用Thread类创建线程类,多个线程之间无法共享线程类的实例变量。

实现Runnable接口比承袭Thread类所具有的上风:

1.得当多个相同的法度榜样代码的线程去处置惩罚同一个资本

2.可以避免java中的单承袭的限定

3.增添法度榜样的壮实性,代码可以被多个线程共享,代码和数据自力

4.线程池只能放入实现Runable或callable类线程,不能直接放入承袭Thread的类

二、练习

1、完成一个java application利用法度榜样,应用准时器编程,在实时显示当前光阴,每1秒时钟内容更新一次。

java法度榜样(test1.java)

import java.util.*;//导入java.util包下的所有类

public class test1 {

private static Timer timer = new Timer();//创建一个Timer类的实例

public static class MyTask extends TimerTask {//创建一个MyTask类承袭于父类TimerTask

@Override

public void run() {

System.out.println(“Now Time: ” + new Date().toString());//输出当前光阴信息

}

}

public static void main(String[] args) {

MyTask task = new MyTask();

timer.schedule(task, 0, 1000);//以当前基定光阴延迟0秒后履行一次,今后按指定距离光阴1秒无限次数的履行。

}

}

运行效果图

2、完成一个java application利用法度榜样,在利用法度榜样主进程中新开一个线程,此线程进行逝世轮回,每1秒被激活一次,激活时即在输出显示当前光阴。

java法度榜样(test2.java)

import java.util.*;//导入java.util包下的所有类

public class test2 {

public static void main(String[] args) {

FirstThread a=new FirstThread();//创建一个FirstThread类工具

a.start();//开启线程

}

}

class FirstThread extends Thread{//创建Thread子类

public void run(){

try{//非常处置惩罚

while (true){//定义逝世轮回

Thread.sleep(1000);//线程每隔1秒激活一次

System.out.println(“Now Time: ” + new Date().toString());//输出当前光阴信息

}

}

catch(InterruptedException e){

}

}

}

运行效果图

3、完成一个java application利用法度榜样,此利用法度榜样公共类有一个double型类属性(变量)x,初始值为0;在利用法度榜样主进程中新开两个线程,这两个线程都进行逝世轮回;第1个线程每隔300ms激活一次,令类属性x自加1.0并输出显示;第2个线程每隔400ms激活一次,令类属性x自加0.1并输出显示。

java法度榜样(test3.java)

public class test3{

static double x=0; //定义一个double型变量并赋值

public static void main(String[] args){

new Thread(new OneThread()).start();//开启线程

new Thread(new TwoThread()).start();//开启线程

}

public static class OneThread implements Runnable{//经由过程实现Runnable接口来创建线程类

public void run(){

while (true){//定义逝世轮回

try{//非常处置惩罚

Thread.sleep(300);//线程每隔300ms激活一次

x=x+1;

System.out.println(“one:”+x);//输出x

}

catch(InterruptedException e){

}

}

}

}

public static class TwoThread implements Runnable{//经由过程实现Runnable接口来创建线程类

public void run(){

while (true){//定义逝世轮回

try{//非常处置惩罚

Thread.sleep(400);//线程每隔400ms激活一次

x=x+0.1;

System.out.println(“two:”+x);//输出x

}

catch(InterruptedException e){

}

}

}

}

}

运行效果图

java 准时义务多线程处置惩罚

@Configuration

@EnableScheduling

public class ScheduleConfig implements SchedulingConfigurer, AsyncConfigurer{

/** 异步处置惩罚 */

public void configureTasks(ScheduledTaskRegistrar taskRegistrar){

TaskScheduler taskScheduler = taskScheduler();

taskRegistrar.setTaskScheduler(taskScheduler);

}

/** 准时义务多线程处置惩罚 */

@Bean(destroyMethod = “shutdown”)

public ThreadPoolTaskScheduler taskScheduler(){

ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();

scheduler.setPoolSize(20);

scheduler.setThreadNamePrefix(“task-”);

scheduler.setAwaitTerminationSeconds(60);

scheduler.setWaitForTasksToCompleteOnShutdown(true);

return scheduler;

}

/** 异步处置惩罚 */

public Executor getAsyncExecutor(){

Executor executor = taskScheduler();

return executor;

}

/** 异步处置惩罚 非常 */

public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler(){

return new SimpleAsyncUncaughtExceptionHandler();

}

}

您可能还会对下面的文章感兴趣: