码迷,mamicode.com
首页 > 其他好文 > 详细

TaskTimer

时间:2019-05-08 12:11:53      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:线程安全   个数   数据   this   timer   auth   nta   time   mamicode   

什么是调度

任务:就是事情

调度:在不同的时间点或者在指定的时间点或者间隔多长时间去运行这个任务。就是生活中的闹钟

相关的类
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

标签:线程安全   个数   数据   this   timer   auth   nta   time   mamicode   

原文地址:https://www.cnblogs.com/bfcs/p/10831029.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!