corejava day13 - 守护线程、定时器Timer
与线程同步
2011/8/9
===============================================
1. 守护线程(后台线程)
1)特点:
a.后台进程与前台进程相伴,
当所有前台线程都结束时,
Java进程结束后台线程,
不管是否后台线程是否运行到结尾, 都被停掉!
b.主线程在默认情况下是前台线程,
由前台线程创建的线程在默认的情况下也是前台线程,
后台线程创建的线程默认的情况下也是后台线程。
2)设置为守护线程:
Thread类的方法 -
void setDaemon(true),
将一个线程设置为守护线程,
必须在 线程启动前设置。
boolean isDaemon(),
判断一个线程是否为守护线程。
2.定时器Timer
1) java.util.Timer类 -
定时器,定时执行特定的任务
构造方法:Timer() - 创建一个新的定时器
Timer(boolean isDaemon)
- 创建一个新的定时器,
指定其相关的线程是否作为守护线程运行
Timer(String name)
- 创建一个新的定时器,指定其相关的线程名称
Timer(String name,
boolean isDaemon)
- 创建一个新的定时器,指定其相关的线程名称,
并且指定其相关的线程是否作为守护线程运行
常用方法:void schedule(TimerTask task,
Date time)
- 安排在指定的时间执行指定的任务
void schedule(TimerTask task,
Date fistTime,
long period) -
安排指定的任务在指定的时间以固定的时间延迟执行,
参数period指定每次执行任务的时间间隔,时间是毫秒
void schedule(TimerTask task,
long delay)
- 安排在指定的延迟后执行指定的任务,
参数delay指定延迟时间,单位是毫秒
void schedule(TimerTask task,
long delay,
long period) -
安排在指定的延迟后执行指定的任务,
按照固定的时间间隔重复执行
void cancel() - 终止定时器的执行
2) java.util.TimerTask类 -
表示定时器执行的一项任务
TimerTask类是一个抽象类,实现Runnable接口,需要重写run()方法
3) 使用定时器的步骤:
a. Timer timer = new Timer(true);
b. TimerTask task = new TimerTask(){
public void run(){
....
}
}
c.timer.schedule(task,10,500) //设置定时任务,延迟10毫秒后按照固定的500毫秒的时间间隔执行任务
3.线程同步
1)线程的职责就是执行一些操作,
这些操作可能会操作与其它线程共享的资源,
从而产生并发冲突。
课堂练习:SynThreadDemo
2)原子操作:为避免并发冲突,
与共享资源相关的一组操作应该作为原子操作来完成。
3)同步代码块:为了保证每个线程能正常执行原子操作,
Java引入同步机制。
在原子操作的代码前加上
synchronized标记,这样的代码块称为同步代码块。
synchronized(this){
...//同步代码块
}
如果方法的全部代码需要同步,
可以简单使用 synchronized修饰方法,使之成为同步方法。
当某个线程调用这个方法之后,
其它的线程不能同时再调用这个方法。
4.Java中的同步API
1) StringBuffer 是同步的,
StringBuilder 不是同步的
2) Vector 和 Hashtable 是同步的
ArrayList 和 HashMap 不是同步的
Stack类是同步的
3)Collections 提供了非同步集合到同步集合
转换方法
Collections提供的转换方法(静态方法):
List synchronizedList(List list)
Collection synchronizedCollection
(Collection)
synchronizedSet
synchronizedSortedSet
synchronizedMap
synchronizedSortedMap
ArrayList list = new ArrayList();
List syncList =
Collections.synchronizedList(list);
synchronized(synList){
...
}
作业:
1 复习实现全部课堂代码
2 分别建立两个线程类:Producer类和Comsumer类
,两个线程协作完成随机数据的产生和消费。
a.Producer线程随机生成1到100之间的整数a,
并将其压入一个堆栈中,
随后通知Comsumer线程,Producer线程进入等待状态。
b.Consumer线程在接到通知后从堆栈中取出同一个
随机数a,随后通知Producer线程,Comsumer线程进入等待状态。
运行结果如下:
[Producer] - 20
[Consumer] - 20
[Producer] - 32
[Consumer] - 32
......
与线程同步
2011/8/9
===============================================
1. 守护线程(后台线程)
1)特点:
a.后台进程与前台进程相伴,
当所有前台线程都结束时,
Java进程结束后台线程,
不管是否后台线程是否运行到结尾, 都被停掉!
b.主线程在默认情况下是前台线程,
由前台线程创建的线程在默认的情况下也是前台线程,
后台线程创建的线程默认的情况下也是后台线程。
2)设置为守护线程:
Thread类的方法 -
void setDaemon(true),
将一个线程设置为守护线程,
必须在 线程启动前设置。
boolean isDaemon(),
判断一个线程是否为守护线程。
2.定时器Timer
1) java.util.Timer类 -
定时器,定时执行特定的任务
构造方法:Timer() - 创建一个新的定时器
Timer(boolean isDaemon)
- 创建一个新的定时器,
指定其相关的线程是否作为守护线程运行
Timer(String name)
- 创建一个新的定时器,指定其相关的线程名称
Timer(String name,
boolean isDaemon)
- 创建一个新的定时器,指定其相关的线程名称,
并且指定其相关的线程是否作为守护线程运行
常用方法:void schedule(TimerTask task,
Date time)
- 安排在指定的时间执行指定的任务
void schedule(TimerTask task,
Date fistTime,
long period) -
安排指定的任务在指定的时间以固定的时间延迟执行,
参数period指定每次执行任务的时间间隔,时间是毫秒
void schedule(TimerTask task,
long delay)
- 安排在指定的延迟后执行指定的任务,
参数delay指定延迟时间,单位是毫秒
void schedule(TimerTask task,
long delay,
long period) -
安排在指定的延迟后执行指定的任务,
按照固定的时间间隔重复执行
void cancel() - 终止定时器的执行
2) java.util.TimerTask类 -
表示定时器执行的一项任务
TimerTask类是一个抽象类,实现Runnable接口,需要重写run()方法
3) 使用定时器的步骤:
a. Timer timer = new Timer(true);
b. TimerTask task = new TimerTask(){
public void run(){
....
}
}
c.timer.schedule(task,10,500) //设置定时任务,延迟10毫秒后按照固定的500毫秒的时间间隔执行任务
3.线程同步
1)线程的职责就是执行一些操作,
这些操作可能会操作与其它线程共享的资源,
从而产生并发冲突。
课堂练习:SynThreadDemo
2)原子操作:为避免并发冲突,
与共享资源相关的一组操作应该作为原子操作来完成。
3)同步代码块:为了保证每个线程能正常执行原子操作,
Java引入同步机制。
在原子操作的代码前加上
synchronized标记,这样的代码块称为同步代码块。
synchronized(this){
...//同步代码块
}
如果方法的全部代码需要同步,
可以简单使用 synchronized修饰方法,使之成为同步方法。
当某个线程调用这个方法之后,
其它的线程不能同时再调用这个方法。
4.Java中的同步API
1) StringBuffer 是同步的,
StringBuilder 不是同步的
2) Vector 和 Hashtable 是同步的
ArrayList 和 HashMap 不是同步的
Stack类是同步的
3)Collections 提供了非同步集合到同步集合
转换方法
Collections提供的转换方法(静态方法):
List synchronizedList(List list)
Collection synchronizedCollection
(Collection)
synchronizedSet
synchronizedSortedSet
synchronizedMap
synchronizedSortedMap
ArrayList list = new ArrayList();
List syncList =
Collections.synchronizedList(list);
synchronized(synList){
...
}
作业:
1 复习实现全部课堂代码
2 分别建立两个线程类:Producer类和Comsumer类
,两个线程协作完成随机数据的产生和消费。
a.Producer线程随机生成1到100之间的整数a,
并将其压入一个堆栈中,
随后通知Comsumer线程,Producer线程进入等待状态。
b.Consumer线程在接到通知后从堆栈中取出同一个
随机数a,随后通知Producer线程,Comsumer线程进入等待状态。
运行结果如下:
[Producer] - 20
[Consumer] - 20
[Producer] - 32
[Consumer] - 32
......