国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

周期性線程池 newScheduledThreadPool

這篇具有很好參考價值的文章主要介紹了周期性線程池 newScheduledThreadPool。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

newScheduledThreadPool

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
    return new ScheduledThreadPoolExecutor(corePoolSize);
}
    
public ScheduledThreadPoolExecutor(int corePoolSize) {
    super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue());
}
ScheduledThreadPoolExecutor繼承自ThreadPoolExecutor。它主要用來在給定的延遲之后運(yùn)行任務(wù),或者定期執(zhí)行任務(wù)。ScheduledThreadPoolExecutor的功能與Timer類似,但ScheduledThreadPoolExecutor功能更強(qiáng)大、更靈活。Timer對應(yīng)的是單個后臺線程,而ScheduledThreadPoolExecutor可以在構(gòu)造函數(shù)中指定多個對應(yīng)的后臺線程數(shù)。
Creates a thread pool that can schedule commands to run after a given delay, or to execute periodically.
DelayQueue是一個無界隊列,所以ThreadPoolExecutor的maximumPoolSize在Scheduled-ThreadPoolExecutor中沒有什么意義(設(shè)置maximumPoolSize的大小沒有什么效果)。
ScheduledThreadPoolExecutor的執(zhí)行主要分為兩大部分。
1)當(dāng)調(diào)用ScheduledThreadPoolExecutor的scheduleAtFixedRate()方法或者scheduleWithFixedDelay()方法時,會向ScheduledThreadPoolExecutor的DelayQueue添加一個實現(xiàn)了RunnableScheduledFutur接口的ScheduledFutureTask。
2)線程池中的線程從DelayQueue中獲取ScheduledFutureTask,然后執(zhí)行任務(wù)。

ScheduledThreadPoolExecutor的實現(xiàn)

ScheduledThreadPoolExecutor會把待調(diào)度的任務(wù)(ScheduledFutureTask)放到一個DelayQueue中。
ScheduledFutureTask 主要包含3個成員變量,如下。
·long型成員變量time,表示這個任務(wù)將要被執(zhí)行的具體時間
·long型成員變量sequenceNumber,表示這個任務(wù)被添加到ScheduledThreadPoolExecutor中的序號。
·long型成員變量period,表示任務(wù)執(zhí)行的間隔周期。
DelayQueue 封裝了一個 PriorityQueue ,這個PriorityQueue會對隊列中的Scheduled-FutureTask進(jìn)行排序。排序時,time小的排在前面(時間早的任務(wù)將被先執(zhí)行)。如果兩個ScheduledFutureTask的time相同,就比較sequenceNumber,sequenceNumber小的排在前面(也就是說,如果兩個任務(wù)的執(zhí)行時間相同,那么先提交的任務(wù)將被先執(zhí)行)。
下圖是ScheduledThreadPoolExecutor中的線程1執(zhí)行某個周期任務(wù)的4個步驟。

周期性線程池 newScheduledThreadPool

1)線程1從DelayQueue中獲取已到期的ScheduledFutureTask(DelayQueue.take())。到期任務(wù)是指ScheduledFutureTask的time大于等于當(dāng)前時間。
2)線程1執(zhí)行這個ScheduledFutureTask。
3)線程1修改ScheduledFutureTask的time變量為下次將要被執(zhí)行的時間。
4)線程1把這個修改time之后的ScheduledFutureTask放回DelayQueue中(Delay-Queue.add())。

獲取任務(wù)的過程
周期性線程池 newScheduledThreadPool

獲取任務(wù)分為3大步驟
1)獲取Lock。
2)獲取周期任務(wù)。
·如果PriorityQueue為空,當(dāng)前線程到Condition中等待;否則執(zhí)行下面的2.2。
·如果PriorityQueue的頭元素的time時間比當(dāng)前時間大,到Condition中等待到time時間;否則執(zhí)行下面的2.3。
·獲取PriorityQueue的頭元素(2.3.1);如果PriorityQueue不為空,則喚醒在Condition中等待的所有線程(2.3.2)。
3)釋放Lock。
ScheduledThreadPoolExecutor在一個循環(huán)中執(zhí)行步驟2,直到線程從PriorityQueue獲取到一個元素之后(執(zhí)行2.3.1之后),才會退出無限循環(huán)(結(jié)束步驟2)。

把ScheduledFutureTask放入DelayQueue中的過程

周期性線程池 newScheduledThreadPool

添加任務(wù)分為3大步驟。
1)獲取Lock。
2)添加任務(wù)。
·向PriorityQueue添加任務(wù)。
·如果在上面2.1中添加的任務(wù)是PriorityQueue的頭元素,喚醒在Condition中等待的所有線程。
3)釋放Lock。

-----------------------------------------------------------------------------讀書筆記摘自 書名:Java并發(fā)編程的藝術(shù) 作者:方騰飛;魏鵬;程曉明

常見用途

參考:Executor框架的成員文章來源地址http://www.zghlxwxcb.cn/news/detail-453505.html

線程任務(wù)

public class Task implements Runnable {
    private final String name;

    public Task(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " → " + name + " Start Time = " + new Date());
        processCommand();
        System.out.println(Thread.currentThread().getName() + " → " + name + " End   Time = " + new Date());
    }

    private void processCommand() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

1. schedule(new Task(), 10, TimeUnit.SECONDS)

public class ScheduledThreadPool {
    public static void main(String args[]) throws InterruptedException, ExecutionException {

        System.out.println(Thread.currentThread().getName() + "線程: Start at: " + new Date());

        ScheduledThreadPoolExecutor exec = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(5);

        for (int i = 0; i < 10; i++) {
            System.out.println("添加了第" + i + "個線程任務(wù) " + new Date());
            exec.schedule(new Task("線程名字" + i), 10, TimeUnit.SECONDS);// 延遲10秒執(zhí)行
        }

        exec.shutdown();

        System.out.println(Thread.currentThread().getName() + "線程: 打卡" + new Date());

        while (!exec.isTerminated()) {
            // wait for all tasks to finish
        }

        System.out.println(Thread.currentThread().getName() + "線程: Finished all threads at:" + new Date());
    }
}

執(zhí)行結(jié)果分析

執(zhí)行結(jié)果
main線程: Start at: Sat May 20 12:51:32 CST 2023
添加了第0個線程任務(wù) Sat May 20 12:51:32 CST 2023
添加了第1個線程任務(wù) Sat May 20 12:51:32 CST 2023
添加了第2個線程任務(wù) Sat May 20 12:51:32 CST 2023
添加了第3個線程任務(wù) Sat May 20 12:51:32 CST 2023
添加了第4個線程任務(wù) Sat May 20 12:51:32 CST 2023
添加了第5個線程任務(wù) Sat May 20 12:51:32 CST 2023
添加了第6個線程任務(wù) Sat May 20 12:51:32 CST 2023
添加了第7個線程任務(wù) Sat May 20 12:51:32 CST 2023
添加了第8個線程任務(wù) Sat May 20 12:51:32 CST 2023
添加了第9個線程任務(wù) Sat May 20 12:51:32 CST 2023
main線程: 打卡Sat May 20 12:51:32 CST 2023
pool-1-thread-5 → 線程名字2 Start Time = Sat May 20 12:51:42 CST 2023
pool-1-thread-3 → 線程名字1 Start Time = Sat May 20 12:51:42 CST 2023
pool-1-thread-4 → 線程名字3 Start Time = Sat May 20 12:51:42 CST 2023
pool-1-thread-2 → 線程名字4 Start Time = Sat May 20 12:51:42 CST 2023
pool-1-thread-1 → 線程名字0 Start Time = Sat May 20 12:51:42 CST 2023
pool-1-thread-3 → 線程名字1 End Time = Sat May 20 12:51:45 CST 2023
pool-1-thread-5 → 線程名字2 End Time = Sat May 20 12:51:45 CST 2023
pool-1-thread-3 → 線程名字5 Start Time = Sat May 20 12:51:45 CST 2023
pool-1-thread-5 → 線程名字6 Start Time = Sat May 20 12:51:45 CST 2023
pool-1-thread-4 → 線程名字3 End Time = Sat May 20 12:51:45 CST 2023
pool-1-thread-4 → 線程名字7 Start Time = Sat May 20 12:51:45 CST 2023
pool-1-thread-2 → 線程名字4 End Time = Sat May 20 12:51:45 CST 2023
pool-1-thread-2 → 線程名字8 Start Time = Sat May 20 12:51:45 CST 2023
pool-1-thread-1 → 線程名字0 End Time = Sat May 20 12:51:45 CST 2023
pool-1-thread-1 → 線程名字9 Start Time = Sat May 20 12:51:45 CST 2023
pool-1-thread-3 → 線程名字5 End Time = Sat May 20 12:51:48 CST 2023
pool-1-thread-5 → 線程名字6 End Time = Sat May 20 12:51:48 CST 2023
pool-1-thread-4 → 線程名字7 End Time = Sat May 20 12:51:48 CST 2023
pool-1-thread-2 → 線程名字8 End Time = Sat May 20 12:51:48 CST 2023
pool-1-thread-1 → 線程名字9 End Time = Sat May 20 12:51:48 CST 2023
main線程: Finished all threads at:Sat May 20 12:51:48 CST 2023
從控制臺結(jié)果可以看出:
5個線程去執(zhí)行10個線程任務(wù),線程任務(wù)放到線程池后延遲10秒執(zhí)行

scheduleAtFixedRate() scheduleWithFixedDelay()
以固定的 頻率 執(zhí)行 以固定的 延時 執(zhí)行
period(周期)指的是兩次成功執(zhí)行之間的時間。
上一個任務(wù)開始的時間計時,一個period后,檢測上一個任務(wù)是否執(zhí)行完畢,
如果上一個任務(wù)執(zhí)行完畢,則當(dāng)前任務(wù)立即執(zhí)行,
如果上一個任務(wù)沒有執(zhí)行完畢,則需要等上一個任務(wù)執(zhí)行完畢后立即執(zhí)行。
delay(延時)指的是一次執(zhí)行終止和下一次執(zhí)行開始之間的延遲。

2. scheduleWithFixedDelay(new Task(), 2, 4, TimeUnit.SECONDS) 初始延時 2s, 固定延時4s

public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                 long initialDelay,
                                                 long delay,
                                                 TimeUnit unit);
參數(shù) 含義
command the task to execute
initialDelay the time to delay first execution
delay the delay between the termination of one execution and the commencement of the next
unit the time unit of the initialDelay and delay parameters
public class FixedDelay {
    public static void main(String args[]) throws InterruptedException, ExecutionException {
        way1();
        way2();
    }

    private static void way2() {
        System.out.println(Thread.currentThread().getName() + "線程: Start at: " + new Date());

        ScheduledThreadPoolExecutor scheduledExecutorService = new ScheduledThreadPoolExecutor(1);

        scheduledExecutorService.scheduleWithFixedDelay(() -> {
            System.out.println(Thread.currentThread().getName() + " → " + " Start Time = " + new Date());
            try {
                sleep(3000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(Thread.currentThread().getName() + " → " + " End   Time = " + new Date());
        }, 1, 4, TimeUnit.SECONDS);  // 延遲 1s,周期 4s
    }

    private static void way1() {
        System.out.println(Thread.currentThread().getName() + "線程: Start at: " + new Date());

        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);

        scheduledExecutorService.scheduleWithFixedDelay(new Task("任務(wù)"), 1, 4, TimeUnit.SECONDS);  // 延遲 1s, 周期 4s
    }
}

執(zhí)行結(jié)果分析

執(zhí)行結(jié)果 分析
main線程: Start at: Sat May 20 18:54:29 CST 2023
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 18:54:30 CST 2023 延遲 1 s
pool-1-thread-1 → 任務(wù) End Time = Sat May 20 18:54:33 CST 2023
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 18:54:37 CST 2023 等待 4 s 再開始
pool-1-thread-1 → 任務(wù) End Time = Sat May 20 18:54:40 CST 2023
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 18:54:44 CST 2023 等待 4 s 再開始
pool-1-thread-1 → 任務(wù) End Time = Sat May 20 18:54:47 CST 2023
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 18:54:51 CST 2023 等待 4 s 再開始
pool-1-thread-1 → 任務(wù) End Time = Sat May 20 18:54:54 CST 2023

3. scheduleAtFixedRate(new Task(), 1, 4, TimeUnit.SECONDS) 初始延時 1s, 周期4s

執(zhí)行結(jié)果分析

執(zhí)行結(jié)果 分析
前置條件 任務(wù)用時 3 秒, period = 4
main線程: Starting at: Sat May 20 19:31:13 CST 2023
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 19:31:14 CST 2023 延時 1
pool-1-thread-1 → 任務(wù) End Time = Sat May 20 19:31:17 CST 2023 任務(wù)用時 3
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 19:31:18 CST 2023 period(周期) 4
pool-1-thread-1 → 任務(wù) End Time = Sat May 20 19:31:21 CST 2023
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 19:31:22 CST 2023
pool-1-thread-1 → 任務(wù) End Time = Sat May 20 19:31:25 CST 2023
任務(wù)用時 < period(周期) ,等待時長為:period 需要等待period再開始下一個
前置條件 任務(wù)用時 3 秒, period = 3
main線程: Starting at: Sat May 20 19:35:33 CST 2023
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 19:35:34 CST 2023
pool-1-thread-1 → 任務(wù) End Time = Sat May 20 19:35:37 CST 2023
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 19:35:37 CST 2023 period(周期) 3
pool-1-thread-1 → 任務(wù) End Time = Sat May 20 19:35:40 CST 2023
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 19:35:40 CST 2023
pool-1-thread-1 → 任務(wù) End Time = Sat May 20 19:35:43 CST 2023
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 19:35:43 CST 2023
任務(wù)用時 = period(周期) ,等待時長為:period 需要等待period再開始下一個
前置條件 任務(wù)用時 3 秒, period = 2
main線程: Starting at: Sat May 20 19:37:03 CST 2023
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 19:37:04 CST 2023
pool-1-thread-1 → 任務(wù) End Time = Sat May 20 19:37:07 CST 2023
pool-1-thread-1 → 任務(wù) Start Time = Sat May 20 19:37:07 CST 2023 period(周期) 2 秒 無效,以任務(wù)用時為準(zhǔn),故結(jié)束就開始
pool-1-thread-1 → 任務(wù) End Time = Sat May 20 19:37:10 CST 2023
任務(wù)用時 > period(周期) 4 秒 ,等待時長為:任務(wù)用時 等任務(wù)結(jié)束后直接開始執(zhí)行下一個

定時任務(wù)?每天晚上9點(diǎn)執(zhí)行一次

public class FixedRateDemo {
    public static void main(String args[]) throws InterruptedException, ExecutionException, ParseException {
        System.out.println(Thread.currentThread().getName() + "線程: Starting at: " + new Date());

        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
        // long oneDay = 24 * 60 * 60 * 1000=86400000; // 1天24小時作為周期
        // long initDelay = getTimeMillis("21:00:00") - System.currentTimeMillis(); // 當(dāng)前時間

        long oneDayPeriod = 10000; // 正常1天=24*60*60*1000=86400000ms,這里用5s來模擬
//        long initDelay = getTimeMillis("21:00:00") - getTimeMillis("20:59:57"); // 假設(shè)模擬此時當(dāng)天的20:59:57 → 3000ms
        long initDelay = getTimeMillis("21:00:00") - getTimeMillis("21:00:03"); // 假設(shè)模擬此時當(dāng)天的21:00:03 →-3000ms

        initDelay = initDelay > 0 ? initDelay : oneDayPeriod + initDelay;

        executor.scheduleAtFixedRate(new Task("定時任務(wù)"), initDelay, oneDayPeriod, TimeUnit.MILLISECONDS);
    }


    /**
     * 獲取指定時間對應(yīng)的毫秒數(shù)
     */
    private static long getTimeMillis(String time) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
        DateFormat dayFormat = new SimpleDateFormat("yy-MM-dd");
        Date curDate = dateFormat.parse(dayFormat.format(new Date()) + " " + time);
        return curDate.getTime();
    }
}

執(zhí)行結(jié)果分析

執(zhí)行結(jié)果 模擬數(shù)據(jù) 分析
前置條件:模擬20:59:57開始執(zhí)行定時任務(wù),21:00:00正式執(zhí)行,周期10
main線程: Starting at: Sat May 20 20:27:54 CST 2023 20:59:57 開始執(zhí)行時間
pool-1-thread-1 → 定時任務(wù) Start Time = Sat May 20 20:27:57 CST 2023 21:00:00 當(dāng)天9點(diǎn)開始執(zhí)行
pool-1-thread-1 → 定時任務(wù) End Time = Sat May 20 20:28:00 CST 2023 21:00:03 任務(wù)執(zhí)行完畢
pool-1-thread-1 → 定時任務(wù) Start Time = Sat May 20 20:28:07 CST 2023 21:00:00 29點(diǎn)重新執(zhí)行
pool-1-thread-1 → 定時任務(wù) End Time = Sat May 20 20:28:10 CST 2023
pool-1-thread-1 → 定時任務(wù) Start Time = Sat May 20 20:28:17 CST 2023
pool-1-thread-1 → 定時任務(wù) End Time = Sat May 20 20:28:20 CST 2023
pool-1-thread-1 → 定時任務(wù) Start Time = Sat May 20 20:28:27 CST 2023
pool-1-thread-1 → 定時任務(wù) End Time = Sat May 20 20:28:30 CST 2023
pool-1-thread-1 → 定時任務(wù) Start Time = Sat May 20 20:28:37 CST 2023
前置條件:模擬21:00:03開始執(zhí)行定時任務(wù),21:00:00正式執(zhí)行,周期10
main線程: Starting at: Sat May 20 20:41:50 CST 2023 21:00:03 開始執(zhí)行時間
pool-1-thread-1 → 定時任務(wù) Start Time = Sat May 20 20:41:57 CST 2023 21:00:00 29點(diǎn)開始執(zhí)行
pool-1-thread-1 → 定時任務(wù) End Time = Sat May 20 20:42:00 CST 2023 21:00:03 任務(wù)執(zhí)行完畢
pool-1-thread-1 → 定時任務(wù) Start Time = Sat May 20 20:42:07 CST 2023 21:00:00 39點(diǎn)重新執(zhí)行
pool-1-thread-1 → 定時任務(wù) End Time = Sat May 20 20:42:10 CST 2023
pool-1-thread-1 → 定時任務(wù) Start Time = Sat May 20 20:42:17 CST 2023
pool-1-thread-1 → 定時任務(wù) End Time = Sat May 20 20:42:20 CST 2023
pool-1-thread-1 → 定時任務(wù) Start Time = Sat May 20 20:42:27 CST 2023
pool-1-thread-1 → 定時任務(wù) End Time = Sat May 20 20:42:30 CST 2023

到了這里,關(guān)于周期性線程池 newScheduledThreadPool的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • flink生成水位線記錄方式--周期性水位線生成器

    在flink基于事件的時間處理中,水位線記錄的生成是一個很重要的環(huán)節(jié),本文就來記錄下幾種水位線記錄的生成方式的其中一種:周期性水位線生成器 1.1 BoundedOutOfOrdernessTimeStampExtractor 他會接收一個表示最大延遲的參數(shù),比如1分鐘,意味著如果到達(dá)的元素的事件時間和之前到

    2024年02月07日
    瀏覽(20)
  • Abaqus CAE 2018插件使用詳解:基于周期性邊界條件定義3D幾何模型的實踐指南**

    注:這篇文章是為了幫助讀者更好地理解和使用Abaqus CAE 2018的插件來定義周期性邊界條件。所提供的信息是基于我個人的理解和實踐,如有不準(zhǔn)確或者有更好的建議,歡迎讀者們指正和交流。 一、 引言 在進(jìn)行無限或半無限域建模時,周期性邊界條件可為我們提供了一種模擬

    2024年02月11日
    瀏覽(25)
  • 使用Dream3D和MATLAB從綜合構(gòu)建微結(jié)構(gòu)到創(chuàng)建具有周期性邊界條件的Abaqus輸入文件的一站式解決方案

    聲明 :本文中的所有內(nèi)容僅供學(xué)術(shù)研究和討論,不保證完全無誤。對于使用本文內(nèi)容可能產(chǎn)生的任何后果,作者不承擔(dān)任何責(zé)任。希望大家在使用時,結(jié)合自己的實際情況進(jìn)行酌情調(diào)整。 當(dāng)我們面臨材料力學(xué)問題,包括材料的疲勞、斷裂和塑性等行為的仿真時,一個常見的

    2024年02月10日
    瀏覽(43)
  • 為什么RIP使用UDP,OSPF使用IP,而BGP使用TCP?為什么RIP周期性地和鄰站交換路由信息而BGP卻不這樣做?

    RIP只和鄰站交換信息,使用UDP無可靠保障,但開銷小,可以滿足RIP要求; OSPF使用可靠的洪泛法,直接使用IP,靈活、開銷??; BGP需要交換整個路由表和更新信息,TCP提供可靠交付以減少帶寬消耗; RIP使用不保證可靠交付的UDP,因此必須不斷地(周期性地)和鄰站交換信息才

    2024年02月02日
    瀏覽(34)
  • 【正點(diǎn)原子STM32】RTC實時時鐘(RTC方案、BCD碼、時間戳、RTC相關(guān)寄存器和HAL庫驅(qū)動、RTC基本配置步驟、RTC基本驅(qū)動步驟、時間設(shè)置和讀取、RTC鬧鐘配置和RTC周期性自動喚醒配置)

    【正點(diǎn)原子STM32】RTC實時時鐘(RTC方案、BCD碼、時間戳、RTC相關(guān)寄存器和HAL庫驅(qū)動、RTC基本配置步驟、RTC基本驅(qū)動步驟、時間設(shè)置和讀取、RTC鬧鐘配置和RTC周期性自動喚醒配置)

    一、RTC簡介 二、STM32 RTC框圖介紹 2.1、STM32 F1 RTC結(jié)構(gòu)框圖 2.2、STM32 F4 / F7 / H7 RTC結(jié)構(gòu)框圖 三、RTC相關(guān)寄存器介紹 3.1、RTC基本配置步驟 3.2、RTC相關(guān)寄存器(F1) 3.3、RTC相關(guān)寄存器(F4 / F7 / H7) 四、RTC相關(guān)HAL庫驅(qū)動介紹 4.1、RTC相關(guān)HAL庫驅(qū)動(F1) 4.2、RTC相關(guān)HAL庫驅(qū)動(F4 / F7 /

    2024年03月27日
    瀏覽(25)
  • 線程生命周期、線程通訊

    線程生命周期、線程通訊

    ? ? ? ? 有關(guān)線程生命周期就要看下面這張圖,圍繞這張圖講解它的方法的含義,和不同方法間的區(qū)別。 ? ?1、yield()方法 ? ? yield()讓當(dāng)前正在運(yùn)行的線程回到就緒,以允許具有相同優(yōu)先級的其他線程獲得運(yùn)行的機(jī)會。但是,實際中無法保證yield()達(dá)到讓步的目的,因為,讓

    2024年02月09日
    瀏覽(23)
  • [Java]線程生命周期與線程通信

    [Java]線程生命周期與線程通信

    【版權(quán)聲明】未經(jīng)博主同意,謝絕轉(zhuǎn)載?。ㄕ堊鹬卦瓌?chuàng),博主保留追究權(quán)) https://www.cnblogs.com/cnb-yuchen/p/18162522 出自【進(jìn)步*于辰的博客】 線程生命周期與進(jìn)程有諸多相似,所以我們很容易將兩者關(guān)聯(lián)理解并混淆,一些細(xì)節(jié)之處確有許多不同,因為線程調(diào)度與進(jìn)程調(diào)度雖都由

    2024年04月27日
    瀏覽(19)
  • 進(jìn)程與線程、線程創(chuàng)建、線程周期、多線程安全和線程池(ThreadPoolExecutor)

    進(jìn)程與線程、線程創(chuàng)建、線程周期、多線程安全和線程池(ThreadPoolExecutor)

    什么進(jìn)程? 進(jìn)程是 資源(CPU、內(nèi)存等)分配 的基本單位,它是程序執(zhí)行時的一個實例。程序運(yùn)行時系統(tǒng)就會創(chuàng)建一個進(jìn)程,并為它分配資源,然后把該進(jìn)程放入進(jìn)程就緒隊列,進(jìn)程調(diào)度器選中它的時候就會為它分配CPU時間,程序開始真正運(yùn)行。 什么是線程? 線程是操作系

    2024年02月14日
    瀏覽(35)
  • Java線程生命周期詳解

    Java線程生命周期詳解

    Java中的線程生命周期是多線程開發(fā)的核心概念。了解線程的生命周期以及它們?nèi)绾芜M(jìn)行狀態(tài)轉(zhuǎn)換對于編寫有效且無錯誤的多線程程序至關(guān)重要。 Java線程主要有以下幾個狀態(tài),這些狀態(tài)定義在Thread.State枚舉類中: 新建狀態(tài)(New) :當(dāng)我們創(chuàng)建一個新的線程實例時,線程就處

    2024年02月11日
    瀏覽(24)
  • 高級進(jìn)階多線程——多任務(wù)處理、線程狀態(tài)(生命周期)、三種創(chuàng)建多線程的方式

    高級進(jìn)階多線程——多任務(wù)處理、線程狀態(tài)(生命周期)、三種創(chuàng)建多線程的方式

    Java中的多線程是一個同時執(zhí)行多個線程的進(jìn)程。線程是一個輕量級的子進(jìn)程,是最小的處理單元。多進(jìn)程和多線程都用于實現(xiàn)多任務(wù)處理。 但是,一般使用多線程而不是多進(jìn)程,這是因為線程使用共享內(nèi)存區(qū)域。它們不分配單獨(dú)的內(nèi)存區(qū)域以節(jié)省內(nèi)存,并且線程之間的上下

    2024年02月13日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包