我的需求是获取一个令牌,拿着这个令牌做事,但是令牌有效期只有1分钟,所以我每隔1分钟之后就要刷新一下这个令牌,我在网上搜了一下,没看到我想要的答案,捣鼓了半天发现:
在run方法里面是可以调用别的方法的,因此我们只需要在定时执行的结果当做方法的入参,然后在方法里面去做值的返回,所以我们接受返回值的变量就用成员变量,这样就能把值带到成员变量里面,我们使用成员变量就相当于run方法返回的参数了,为了保证线程的可见性,这个成员变量还需要加上volatile,具体代码如下:
public class CodeGenerateUtil {
static volatile int sum=0;
//把令牌赋值给成员变量
private static void qiuhe(int num){
sum=num;
}
public static void main(String[] args) { int num=0; Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { int num=(int)(Math.random()*100);//随机数模拟得到的令牌 System.out.println("获取令牌为"+num); qiuhe(num);//把令牌当入参传给方法 } }; System.out.println("第一次获取令牌啦!"); // 在一分钟后执行任务,并且每隔一分钟重复执行 timer.schedule(task, 1000, 1000);//为了方便看效果,设置1秒钟执行一次 while (num <10){ System.out.println("执行逻辑中————"); System.out.println("打印逻辑中的令牌为->"+sum); try { Thread.sleep(500);//为了不让逻辑执行太快,方便看效果,睡半秒 } catch (InterruptedException e) { e.printStackTrace(); } num++; } timer.cancel();//逻辑执行完成了,不需要令牌了,取消定时任务 System.out.println("任务结束啦!"); System.out.println(sum); }
}
打印效果:
第一次获取令牌啦!
执行逻辑中————
打印逻辑中的令牌为->0
执行逻辑中————
打印逻辑中的令牌为->0
获取令牌为63
执行逻辑中————
打印逻辑中的令牌为->63
执行逻辑中————
打印逻辑中的令牌为->63
获取令牌为73
执行逻辑中————
打印逻辑中的令牌为->73
执行逻辑中————
打印逻辑中的令牌为->73
获取令牌为5
执行逻辑中————
打印逻辑中的令牌为->5
执行逻辑中————
打印逻辑中的令牌为->5
获取令牌为7
执行逻辑中————
打印逻辑中的令牌为->7
执行逻辑中————
打印逻辑中的令牌为->7
获取令牌为47
任务结束啦!
47
大功告成!就问屌不屌