文章目录

  • 【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);
        }
    }
}