20110907 .线程同步通信与定时器Timer使用
一、 wait()方法。 是用临界资源对象调用他,功能:使当前线程阻塞,同时释放对临界资源加的互斥锁。
Notify()方法 用同一个临界资源将此线程进入到就绪状态
notifyAll()方法 还是用同以哥临界资源调用,将所有等待的线程都唤醒
二、 消费者和生产者
a) 出现问题
i. 线程B写一次,线程A读一次
ii. 在某个时候线程B运行速度比较快,在线程A未读取上一个数据之前,B就写了第二次数据,造成数据遗漏。
iii. 在某个时候线程A运行速度比较快,它读完一次数据之后,线程B还没来得及写,线程A又来读第二次。结果线程A读不到数据,导致运行出错。
b) 线程B正在写数据时,线程A也来读取数据,这时可能线程B还没将数据写完,线程A将数据读走,导致程序出错。
c) 解决方法
i. 一种是采用某种机制保持生产者和消费者之间的同步
ii. 一种是在生产者和消费者之间建立一个管道
d) 示例代码:
Public synchronized void pus(char ch){
While(index==data.length){ //while 防止挂起失败。
Try{
This.wait(); //挂起当前线程并解锁。使此线程进入阻塞状态
}catch(InterruptedException ex){
Systen.out.println(ex.toString());
}
}
This.notify(); //唤醒线程,将此进程进入就绪状态
Data[index]=ch;
Index++;
System.out.println(“produced:”+ch);
}
Public synchronized char pop(){
While(index==0){
Try{
This.wait();
}cathch(InterruptedExceotuin e){
e.printStackTrace();
}
This.notify();
Index--;
System.out.println(“custom:”+data[index]);
Return data[index];
}
}
三、 定时器 Timer和TimerTask
a) Timer类实现的是累死闹钟的功能,也就是定时或者每隔一定时间间隔触发一次线程。
b) TimerTask类是一个抽象类,该类实现了Runnable接口,具备多线程的能力。
c) 通过继承TimerTask类创建子类,使该子类获得多线程的能力,将需要多线程执行的代码书写在run方法的内部。
d) 特殊方法schedule(task,毫秒); 后参数可为毫秒或者data对象
Schedule(task,0,1000) 每过1秒马上执行任务task