守护线程ScheduledThreadPoolExecutor中两个方法的区别demo

package com.pzistart.msgdemoimpl.renlock;

import jdk.nashorn.internal.ir.Block;

import javax.annotation.security.RunAs;
import javax.sound.sampled.FloatControl;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author Pzi
 * @create 2023-01-07 20:56
 */
public class Demo2 {

    private static ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) {

        // 创建一个守护线程
        ScheduledExecutorService daemonExecutor = new ScheduledThreadPoolExecutor(1);
        // 上一个线程执行完毕后,延迟 5s 后再创建一个任务
        // 这里要等上一个执行完毕后,才开始延迟开启下一个任务
        // daemonExecutor.scheduleWithFixedDelay(new Detail(), 2, 5, TimeUnit.SECONDS);

        // 开启一个 Runable 任务后,如果在 period 时间内此任务执行完了,就会在到达 period 时间马上开启下一个 任务,否则要等上一个任务执行完毕
        // 这个方法是只要开启了一个 任务,那么 period 也就同步计时
        daemonExecutor.scheduleAtFixedRate(new Detail(), 2, 5, TimeUnit.SECONDS);

    }

    // 创建一个解析详情线程
    static class Detail implements Runnable {

        @Override
        public void run() {
            try {
                lock.lock();
                System.out.println(Thread.currentThread().getName() + " 上锁");
                Thread.sleep(6000);
                System.out.println(Thread.currentThread().getName() + " 释放锁");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }


}

posted @ 2023-01-08 21:33  pzistart  阅读(70)  评论(0编辑  收藏  举报