文章目录
- 【Java】白话说Java多线程篇(四),生产者/消费者模式与定时任务
- 线程并发协作(生产者/消费者模式)
- 定时任务
- java.util.Timer
- java.util.TimerTask
线程并发协作(生产者/消费者模式)
线程并发协作(也叫线程通信),通常用于生产者/消费者模式,情景如下:
- 生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件。
- 对于生产者,没有生产产品之前,消费者要进入等待状态。而生产了产品之后,又需要马上通知消费者消费
- 对于消费者,在消费之后,要通知生产者已经消费结束,需要继续生产新产品以供消费。
- 在生产者消费者问题种,仅有synchronized是不够的
- synchronized可阻止并发更新同一个共享资源,实现了同步;
- synchronized不能用来实现不同线程之间的消息传递(通信)。
- 线程通过以下方法进行消息传递:
方法名 | 作用 |
final void wait() | 表示线程一直等待直到得到其他线程通知 |
void wait(long time) | 线程等待指定毫秒参数的时间 |
final void wait(long timeout,int nanos) | 线程等待指定毫秒,微秒的时间 |
final void notify() | 唤醒一个处于等待状态的线程 |
final void notifyAll | 唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先运行 |
都只能在同步方法或者同步代码块种使用,否则抛出异常
定时任务
通过Timer和Timetask,我们可以实现定时启动某个线程。
Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。
TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。
java.util.Timer
在这种实现方式种,Timer类作用就是类似闹钟的功能,也就是定时或者每隔一定时间触发一次线程。
其实,Timer类本身实现的就是一个线程,只是这个线程是用来实现调用其他线程的。
java.util.TimerTask
TimerTask类是一个抽象类,该类实现了Runnable接口,所以该类具备多线程的能力。
在这种实现方式种,通过继承TimerTask使该类或得多线程的能力,将需要多线程执行的代码书写在run方法内部,然后通过Timer类启动线程的执行。
例子:
public class TestTimer {
public static void main(String[] args) {
Timer t1 = new Timer();//定义计时器;
MyTask task1 = new MyTask();//定义任务;
t1.schedule(task1,3000); //3秒后执行;
//t1.schedule(task1,5000,1000);//5秒以后每隔1秒执行一次!
//GregorianCalendar calendar1 = new GregorianCalendar(2010,0,5,14,36,57);
//t1.schedule(task1,calendar1.getTime()); //指定时间定时执行;
}
}
class MyTask extends TimerTask {//自定义线程类继承TimerTask类;
public void run() {
for(int i=0;i<10;i++){
System.out.println("任务1:"+i);
}
}
}