Android多线程研究(2)——定时器
先来看一段代码:
public static void main(String[] args) {
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("阳光小强");
}
}, 5000);
int i = 0;
while(true){
System.out.println(i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
将上面代码改动例如以下:
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("阳光小强");
}
}, 2000, 3000);
此时定时器Timer就会在2000ms后開始运行run方法,每隔3000ms反复运行。
假设有一种需求,隔1s、2s、1s、2s......分别运行定时器中的代码(偶数秒和奇数秒分别运行不同的定时器),我们怎样实现(s代表秒)
实现方式一:
public static void main(String[] args) {
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("阳光小强2秒");
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("阳光小强4秒");
}
}, 1000);
}
}, 1000, 2000);
int i = 0;
while(true){
System.out.println(i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
实现方式二:
static int count = 0;
public static void main(String[] args) { class MyTimerTask extends TimerTask{
@Override
public void run() {
count = (count + 1) % 2;
System.out.println("阳光小强" + (2 + 2 * count) + "秒");
new Timer().schedule(new MyTimerTask(), 2000 + 2000 * count);
} }
new Timer().schedule(new MyTimerTask(), 2000); int i = 0;
while(true){
System.out.println(i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
另一种实际情况就是定时发邮件。我们能够用以下的方式
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask; public class TestTimer {
// 时间间隔
private static final long PERIOD_DAY = 24 * 60 * 60 * 1000; public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
/*** 定制每日2:00运行方法 ***/
calendar.set(Calendar.HOUR_OF_DAY, 2);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0); Date date = calendar.getTime(); // 第一次运行定时任务的时间 // 假设第一次运行定时任务的时间 小于 当前的时间
// 此时要在 第一次运行定时任务的时间 加一天,以便此任务在下个时间点运行。假设不加一天。任务会马上运行。
if (date.before(new Date())) {
date = addDay(date, 1);
} new Timer().schedule(new TimerTask() { @Override
public void run() {
//TODO 去发邮件,或者其它定时任务
}
}, date, PERIOD_DAY);
} // 添加或降低天数
public static Date addDay(Date date, int num) {
Calendar startDT = Calendar.getInstance();
startDT.setTime(date);
startDT.add(Calendar.DAY_OF_MONTH, num);
return startDT.getTime();
} }
Android多线程研究(2)——定时器的更多相关文章
- Android多线程研究(6)——多线程之间数据隔离
在上一篇<Android多线程研究(5)--线程之间共享数据>中对线程之间的数据共享进行了学习和研究,这一篇我们来看看怎样解决多个线程之间的数据隔离问题,什么是数据隔离呢?比方说我们如今开 ...
- Android多线程研究(1)——线程基础及源代码剖析
从今天起我们来看一下Android中的多线程的知识,Android入门easy,可是要完毕一个完好的产品却不easy,让我们从线程開始一步步深入Android内部. 一.线程基础回想 package ...
- Android多线程研究(1)——线程基础及源码剖析
从今天起我们来看一下Android中的多线程的知识,Android入门容易,但是要完成一个完善的产品却不容易,让我们从线程开始一步步深入Android内部. 一.线程基础回顾 package com. ...
- Android多线程研究(7)——Java5中的线程并发库
从这一篇开始我们将看看Java 5之后给我们添加的新的对线程操作的API,首先看看api文档: java.util.concurrent包含许多线程安全.测试良好.高性能的并发构建块,我们先看看ato ...
- Android多线程研究(4)——从一道面试题说起
有一道这种面试题:开启一个子线程和主线程同一时候运行,子线程输出10次后接着主线程输出100次,如此重复50次.先看以下代码: package com.maso.test; /** * * @auth ...
- Android多线程研究(3)——线程同步和相互排斥及死锁
为什么会有线程同步的概念呢?为什么要同步?什么是线程同步?先看一段代码: package com.maso.test; public class ThreadTest2 implements Runn ...
- Android多线程研究(9)——读写锁
一.什么是锁 在Java的util.concurrent.locks包下有关于锁的接口和类如下: 先看一段代码: package com.codeing.snail.test; public clas ...
- Android多线程研究(8)——Java中的原子性理解
一.什么是原子性 原子性是世界上最小单位,具有不可分割性.比如a=0;(a非long和double类型)这个操作是不可分割的,那么我们说这个操作是原子操作.再比如:a++;这个操作实际上是a=a+1; ...
- Android多线程研究(9)——线程锁Lock
在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock. Lock接口的实现类提供了比使用synchronized关键字更加灵活 ...
随机推荐
- 接受第三方app分享的数据
前段时间公司项目需要一个需求: 把第三方的app分享的数据接受到自己的apk中, 涉及到的第三方app是: Youtube/Amazon/NetFlix, 这些app通过分享功能把当前的信息分享出去. ...
- .net core2.0下使用Identity改用dapper存储数据
前言. 已经好多天没写博客了,鉴于空闲无聊之时又兴起想写写博客,也当是给自己做个笔记.过了这么些天,我的文笔还是依然那么烂就请多多谅解了.今天主要是分享一下在使用.net core2.0下的实际遇到的 ...
- 用python画一朵玫瑰花
废话不多说,直接上代码 from turtle import * import time setup(600,800,0,0) speed(0) penup() seth(90) fd(340) se ...
- 斯坦福大学自然语言处理第一课——引言(Introduction)
一.课程介绍 斯坦福大学于2012年3月在Coursera启动了在线自然语言处理课程,由NLP领域大牛Dan Jurafsky 和 Chirs Manning教授授课:https://class.co ...
- 第一章:关于Ehcache
PDF官方文档:http://www.ehcache.org/generated/2.10.4/pdf/About_Ehcache.pdf 1.什么是Ehcache? Ehcache是一种开源的基于标 ...
- python之列表(list)的使用方法介绍
python之列表(list)介绍 在python的使用过程中,我们经常会用到列表,然而经常会遇到疑惑,下面我将详细介绍下列表使用方法. 一.列表 列表经常用到的功能使增.删.改和查功能. 1. 增 ...
- C语言之循环计数
#include<stdio.h>int main(){int num,count=0,i=0;scanf("%d",&num);num/=10;count++ ...
- AndroidStudio cannot resolve symbol 解决办法 清楚缓存
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=&qu ...
- Numpy入门 - 行列式转置
本章实例讲解如何将一个数组对象进行转置,我们可以使用.T将行列数据颠倒过来,看下面的代码: import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6 ...
- struts2 谷歌浏览器保存date类型数据时报错
一同事发现一个bug,在chrome上保存一个表单时,后台会报错,而在firefox上则可以正常保存. 奇怪的地方在于,后端的程序是同一个,而在浏览器上查看请求header时,两个浏览器对应的字段内容 ...