写点什么

多线程之守护线程和生产者、消费者模式

作者:几分醉意.
  • 2022-11-24
    安徽
  • 本文字数:1918 字

    阅读完需:约 6 分钟

守护线程

守护线程 java 语言中线程分为两大类:一类是:用户线程一类是:守护线程(后台线程)其中具有代表性的就是:垃圾回收线程(守护线程)。


守护线程的特点:一般守护线程是一个死循环,所有的用户线程只要结束,守护线程自动结束。注意:主线程 main 方法是一个用户线程。


守护线程用在什么地方呢?每天 00:00 的时候系统数据自动备份。这个需要使用到定时器,并且我们可以将定时器设置为守护线程。一直在那里看着,每到 00:00 的时候就备份一次。所有的用户线程如果结束了,守护线程自动退出,没有必要进行数据备份了。


实例


/*所有的用户线程结束,守护线程自动结束守护守护的意思是:用户线程在,你有必要守护。用户线程没了,你就没必要守护了。 */public class 线程守护 {    public static void main(String[] args) {        Thread t = new mm();
//启动线程前,将线程设置为守护线程 t.setDaemon(true);
t.start();
//主线程 :主线程是用户线程 for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() +"-->"+i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
}}class mm extends Thread{ @Override public void run() { int i = 0 ; //即使是死循环,但由于该线程是守护线程,当用户线程结束,守护线程自动终止。 while (true){ System.out.println(Thread.currentThread().getName() +"-->"+(++i)); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }}
复制代码

定时器

定时器的作用:间隔特定的时间,执行特定的程序。每周要进行银行账户的总账操作,每天要进行数据的备份操作...。


在实际的开发中,每隔多久执行一段特定的程序,这种需求是很常见的,那么在 java 中其实可以采用多种方式实现:可以使用 sleep 方法,睡眠,设置睡眠时间,每到这个时间点醒来,执行任务。这种方式是最原始的定时器。(比较 low)在 java 的类库中已经写好了一个定时器:java.util.Timer,可以直接拿来用。不过,这种方式在目前的开发中也很少用,因为现在有很多高级框架都是支持定时任务的。在实际的开发中,目前使用较多的是 Spring 框架中提供的 SpringTask 框架,这个框架只要进行简单的配置,就可以完成定时器的任务。


实例


/*使用定时器指定任务 */public class 定时器 {    public static void main(String[] args) throws Exception {        // 创建定时器对象        Timer timer = new Timer();
//Timer timer = new Timer(true); 守护线程方式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date parse = sdf.parse("2022-9-19 11:52:30"); //timer.schedule(定时任务,第一次执行时间,间隔多久执行一次); timer.schedule(new LogTimerTask(),parse,1000*5); //也可以使用匿名内部类,直接new抽象类
}}class LogTimerTask extends TimerTask{ //子类继承抽象类,要重写抽象方法
@Override public void run() { //编写需要执行的任务 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sdf.format(new Date()); System.out.println(format + ": 成功完成一次数据备份"); }}
复制代码

生产者和消费者模式

wait 和 notify 方法

关于 object 类中的 wait 和 notify 方法。(生产者和消费者模式!)第一:wait 和 notify 方法不是线程对象的方法,是 java 中任何一个 java 对象都有的方法,因为这两个方式是 Object 类中自带的。wait 方法和 notify 方法不是通过线程对象调用,不是这样的:t.wait(),也不是这样的:t.notify()..不对。第二:wait()方法作用?Objecto=newobject(); o.wait();表示:让正在 o 对象上活动的线程进入等待状态,无期限等待,直到被唤醒为止。o.wait();方法的调用,会让"当前线程(正在 o 对象上活动的线程)“进入等待状态。第三:notify()方法作用?Objecto-newbject(); o.notify();表示:唤醒正在 o 对象上等待的线程。还有一个 notifyAll 方法:这个方法是唤醒 o 对象上处于等待的所有线程。


使用 wait 和 notify 方法实现生产者和消费者模式

什么是“生产者和消费者模式”?生产线程负责生产,消费线程负责消费。生产线程和消费线程要达到均衡。这是一种特殊的业务需求,在这种特殊的情况下需要使用 wait 方法和 notify 方法。



发布于: 刚刚阅读数: 4
用户头像

几分醉意.

关注

还未添加个人签名 2022-10-22 加入

还未添加个人简介

评论

发布
暂无评论
多线程之守护线程和生产者、消费者模式_Java_几分醉意._InfoQ写作社区