TaskTimer
Posted bfcs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TaskTimer相关的知识,希望对你有一定的参考价值。
什么是调度
任务:就是事情
调度:在不同的时间点或者在指定的时间点或者间隔多长时间去运行这个任务。就是生活中的闹钟
相关的类
Timer 类:位于 java.util 包中
案例
实现时间的动态刷新
任务类
1 import java.util.Date; 2 import java.util.TimerTask; 3 /** 4 * 任务 5 * @author Administrator 6 * 7 */ 8 public class Clock extends TimerTask{ 9 long time=1000;//1秒 10 @Override 11 public void run() { 12 Date date=new Date(System.currentTimeMillis()+time); 13 System.out.println(date.toLocaleString()); 14 } 15 16 }
创建测试类调度
1 import java.util.Date; 2 import java.util.Timer; 3 import java.util.TimerTask; 4 5 public class TestTimer { 6 public static void main(String[] args) { 7 //(1)创建Timer的对象 8 Timer t=new Timer(); 9 //(2)调用schedule()方法去执行任务 schedule工作计划 10 //创建任务类的对象 11 TimerTask task=new Clock(); 12 //要执行的任务,第二个参数是任务的执行开始时间是当前时间1秒后 ,第三个参数是每隔1秒执行一次 13 t.schedule(task, new Date(System.currentTimeMillis()+1000), 1000); 14 15 } 16 }
运行结果
--------------------------------------------------------------------------------------------
ThreadLocal
ThreadLocal 直译为“本地线程”,其实它就是一容器,用于存放线程的局部变量
作用:为解决多线程程序的并发问题,把原来线程共享的资源变为每个线程都有一个副本,每个线程单独操作自己的副本
案例
实现一个序列号的生成器程序
先创建序列接口
public interface Sequence { public int getNumber();//每次调用时获得一个数,下次调用时,这个数自增 }
使用ThreadLocal实现序列接口
1 public class SequenceImple2 implements Sequence { 2 private static ThreadLocal<Integer> numberContainer=new ThreadLocal<Integer>(){ 3 protected Integer initialValue() { //初始化值为0 4 return 0; 5 } 6 }; 7 8 @Override 9 public int getNumber() { 10 numberContainer.set(numberContainer.get()+1); //从本地线程容器中取值后+1,再返回结果 11 return numberContainer.get(); 12 } 13 14 }
创建线程类来操作实现序列接口的类
1 public class MyThread implements Runnable { 2 private Sequence seq; 3 public MyThread(Sequence seq) { 4 this.seq=seq; 5 } 6 @Override 7 public void run() { 8 for(int i=0;i<3;i++){ 9 System.out.println(Thread.currentThread().getName()+"-->number"+seq.getNumber()); 10 } 11 12 } 13 }
创建测试类
1 public class Test { 2 public static void main(String[] args) { 3 //(1)创建共享资源的对象 4 Sequence seq=new SequenceImple2(); 5 //(2)创建线程类的对象 6 MyThread m=new MyThread(seq); 7 8 //创建三个代理,并启动线程 9 new Thread(m,"A").start(); 10 new Thread(m,"B").start(); 11 new Thread(m,"C").start(); 12 } 13 }
运行结果
----------------------------------------------------------------------------
ThreadLocal 的使用场景为:用来解决数据库连接、Session管理等
当你在一个类中使用 static 成员变量时,一定要问自己这个 static 成员变量需要考虑“线程安全吗?”
(也就是说多个线程需要自己独立的 static 成员变量吗?)如果需要那就需要使用 ThreadLocal。
以上是关于TaskTimer的主要内容,如果未能解决你的问题,请参考以下文章