在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙系統(tǒng)中線程管理的使用

OpenHarmony技術(shù)社區(qū) ? 來源:鴻蒙技術(shù)社區(qū) ? 作者:開鴻HOS小鴻 ? 2021-09-28 09:49 ? 次閱讀

不同應(yīng)用在各自獨(dú)立的進(jìn)程中運(yùn)行。當(dāng)應(yīng)用以任何形式啟動(dòng)時(shí),系統(tǒng)為其創(chuàng)建進(jìn)程,該進(jìn)程將持續(xù)運(yùn)行。當(dāng)進(jìn)程完成當(dāng)前任務(wù)處于等待狀態(tài),且系統(tǒng)資源不足時(shí),系統(tǒng)自動(dòng)回收。

在啟動(dòng)應(yīng)用時(shí),系統(tǒng)會(huì)為該應(yīng)用創(chuàng)建一個(gè)稱為“主線程”的執(zhí)行線程。該線程隨著應(yīng)用創(chuàng)建或消失,是應(yīng)用的核心線程。UI 界面的顯示和更新等操作,都是在主線程上進(jìn)行。

主線程又稱 UI 線程,默認(rèn)情況下,所有的操作都是在主線程上執(zhí)行。如果需要執(zhí)行比較耗時(shí)的任務(wù)(如下載文件、查詢數(shù)據(jù)庫(kù)),可創(chuàng)建其他線程來處理。

如果應(yīng)用的業(yè)務(wù)邏輯比較復(fù)雜,可能需要?jiǎng)?chuàng)建多個(gè)線程來執(zhí)行多個(gè)任務(wù)。這種情況下,代碼復(fù)雜難以維護(hù),任務(wù)與線程的交互也會(huì)更加繁雜。

要解決此問題,開發(fā)者可以使用 TaskDispatcher 來分發(fā)不同的任務(wù)。

TaskDispatcher 介紹

TaskDispatcher 是一個(gè)任務(wù)分發(fā)器,它是 Ability 分發(fā)任務(wù)的基本接口,隱藏任務(wù)所在線程的實(shí)現(xiàn)細(xì)節(jié)。

為保證應(yīng)用有更好的響應(yīng)性,我們需要設(shè)計(jì)任務(wù)的優(yōu)先級(jí)。在 UI 線程上運(yùn)行的任務(wù)默認(rèn)以高優(yōu)先級(jí)運(yùn)行,如果某個(gè)任務(wù)無需等待結(jié)果,則可以用低優(yōu)先級(jí)。

線程優(yōu)先級(jí)介紹:

HIGH:最高任務(wù)優(yōu)先級(jí),比默認(rèn)優(yōu)先級(jí)、低優(yōu)先級(jí)的任務(wù)有更高的幾率得到執(zhí)行。

DEFAULT:默認(rèn)任務(wù)優(yōu)先級(jí), 比低優(yōu)先級(jí)的任務(wù)有更高的幾率得到執(zhí)行。

LOW:低任務(wù)優(yōu)先級(jí),比高優(yōu)先級(jí)、默認(rèn)優(yōu)先級(jí)的任務(wù)有更低的幾率得到執(zhí)行。

TaskDispatcher 具有多種實(shí)現(xiàn),每種實(shí)現(xiàn)對(duì)應(yīng)不同的任務(wù)分發(fā)器。在分發(fā)任務(wù)時(shí)可以指定任務(wù)的優(yōu)先級(jí),由同一個(gè)任務(wù)分發(fā)器分發(fā)出的任務(wù)具有相同的優(yōu)先級(jí)。

系統(tǒng)提供的任務(wù)分發(fā)器有:

GlobalTaskDispatcher

ParallelTaskDispatcher

SerialTaskDispatcher

SpecTaskDispatcher

實(shí)踐

①同步派發(fā)任務(wù) syncDispatch

發(fā)任務(wù)并在當(dāng)前線程等待任務(wù)執(zhí)行完成。在返回前,當(dāng)前線程會(huì)被阻塞:

/**

* 同步派發(fā)任務(wù)

*/

private void syncDispatch() {

TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT);

globalTaskDispatcher.syncDispatch(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “sync task1 run”);

}

});

HiLog.info(LABEL_LOG, “after sync task1”);

globalTaskDispatcher.syncDispatch(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “sync task2 run”);

}

});

HiLog.info(LABEL_LOG, “after sync task2”);

globalTaskDispatcher.syncDispatch(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “sync task3 run”);

}

});

HiLog.info(LABEL_LOG, “after sync task3”);

}

運(yùn)行之后查看日志:

ff7b8964-1fc0-11ec-82a8-dac502259ad0.png

從運(yùn)行結(jié)果我們可以看到,只有在當(dāng)前線程等待任務(wù)執(zhí)行完成之后才會(huì)繼續(xù)往下執(zhí)行,否則當(dāng)前線程會(huì)被阻塞。

所以在使用 syncDispatch 的時(shí)候我們需要注意,如果對(duì) syncDispatch 使用不當(dāng), 將會(huì)導(dǎo)致死鎖。

如下情形可能導(dǎo)致死鎖發(fā)生:

在專有線程上,利用該專有任務(wù)分發(fā)器進(jìn)行 syncDispatch。

在被某個(gè)串行任務(wù)分發(fā)器(dispatcher_a)派發(fā)的任務(wù)中,再次利用同一個(gè)串行任務(wù)分發(fā)器(dispatcher_a)對(duì)象派發(fā)任務(wù)。

在被某個(gè)串行任務(wù)分發(fā)器(dispatcher_a)派發(fā)的任務(wù)中,經(jīng)過數(shù)次派發(fā)任務(wù),最終又利用該(dispatcher_a)串行任務(wù)分發(fā)器派發(fā)任務(wù)。

例如:dispatcher_a 派發(fā)的任務(wù)使用 dispatcher_b 進(jìn)行任務(wù)的派發(fā),在 dispatcher_b 派發(fā)的任務(wù)中又利用 dispatcher_a 進(jìn)行派發(fā)任務(wù)。

串行任務(wù)分發(fā)器(dispatcher_a)派發(fā)的任務(wù)中利用串行任務(wù)分發(fā)器(dispatcher_b)進(jìn)行同步派發(fā)任務(wù),同時(shí) dispatcher_b 派發(fā)的任務(wù)中利用串行任務(wù)分發(fā)器(dispatcher_a)進(jìn)行同步派發(fā)任務(wù)。在特定的線程執(zhí)行順序下將導(dǎo)致死鎖。

②異步派發(fā)任務(wù) asyncDispatch

派發(fā)任務(wù),并立即返回,返回值是一個(gè)可用于取消任務(wù)的接口。

/**

* 異步派發(fā)任務(wù)

*/

private void asyncDispatch() {

TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT);

Revocable revocable = globalTaskDispatcher.asyncDispatch(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “async task1 run”);

}

});

HiLog.info(LABEL_LOG, “after async task1”);

}

運(yùn)行之后查看日志:

0001850a-1fc1-11ec-82a8-dac502259ad0.png

從運(yùn)行結(jié)果我們可以看到,只有在當(dāng)前線程等待任務(wù)執(zhí)行完成之后才會(huì)繼續(xù)往下執(zhí)行,否則當(dāng)前線程會(huì)被阻塞,所以在使用。

③異步延遲派發(fā)任務(wù) delayDispatch

異步執(zhí)行,函數(shù)立即返回,內(nèi)部會(huì)在延時(shí)指定時(shí)間后將任務(wù)派發(fā)到相應(yīng)隊(duì)列中。

延時(shí)時(shí)間參數(shù)僅代表在這段時(shí)間以后任務(wù)分發(fā)器會(huì)將任務(wù)加入到隊(duì)列中,任務(wù)的實(shí)際執(zhí)行時(shí)間可能晚于這個(gè)時(shí)間。

具體比這個(gè)數(shù)值晚多久,取決于隊(duì)列及內(nèi)部線程池的繁忙情況。

/**

* 異步延遲派發(fā)任務(wù)

*/

private void delayDispatch() {

final long callTime = System.currentTimeMillis();

final long delayTime = 50L;

TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT);

Revocable revocable = globalTaskDispatcher.delayDispatch(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “delayDispatch task1 run”);

final long actualDelay = System.currentTimeMillis() - callTime;

HiLog.info(LABEL_LOG, “actualDelayTime 》= delayTime: %{public}b”, (actualDelay 》= delayTime));

}

}, delayTime);

HiLog.info(LABEL_LOG, “after delayDispatch task1”);

}

運(yùn)行之后查看日志:

00860d66-1fc1-11ec-82a8-dac502259ad0.png

從運(yùn)行結(jié)果我們可以看出:

程序首先執(zhí)行“after delayDispatch task1”

然后執(zhí)行“delayDispatch task1 run”

最后執(zhí)行“actualDelayTime 》= delayTime: %{public}b”, (actualDelay 》= delayTime)

這里 actualDelayTime 》= delayTime: true 可以看出延時(shí)時(shí)間參數(shù)僅代表在這段時(shí)間以后任務(wù)分發(fā)器會(huì)將任務(wù)加入到隊(duì)列中,任務(wù)的實(shí)際執(zhí)行時(shí)間可能晚于這個(gè)時(shí)間。

④任務(wù)組 Group

表示一組任務(wù),且該組任務(wù)之間有一定的聯(lián)系,由 TaskDispatcher 執(zhí)行 createDispatchGroup 創(chuàng)建并返回。

將任務(wù)加入任務(wù)組,返回一個(gè)用于取消任務(wù)的接口。

/**

* 任務(wù)組

*/

private void dispatchGroup() {

String dispatcherName = “parallelTaskDispatcher”;

TaskDispatcher dispatcher = createParallelTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);

// 創(chuàng)建任務(wù)組。

Group group = dispatcher.createDispatchGroup();

// 將任務(wù)1加入任務(wù)組,返回一個(gè)用于取消任務(wù)的接口。

dispatcher.asyncGroupDispatch(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “download task1 is running”);

}

});

// 將與任務(wù)1相關(guān)聯(lián)的任務(wù)2加入任務(wù)組。

dispatcher.asyncGroupDispatch(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “download task2 is running”);

}

});

// 在任務(wù)組中的所有任務(wù)執(zhí)行完成后執(zhí)行指定任務(wù)。

dispatcher.groupDispatchNotify(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “the close task is running after all tasks in the group are completed”);

}

});

}

運(yùn)行之后查看日志:

00fbdb4a-1fc1-11ec-82a8-dac502259ad0.png

⑤同步設(shè)置屏障任務(wù) syncDispatchBarrier

在任務(wù)組上設(shè)立任務(wù)執(zhí)行屏障,同步等待任務(wù)組中的所有任務(wù)執(zhí)行完成,再執(zhí)行指定任務(wù)。

/**

* 同步設(shè)置屏障任務(wù)

*/

private void syncDispatchBarrier() {

String dispatcherName = “parallelTaskDispatcher”;

TaskDispatcher dispatcher = createParallelTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);

// 創(chuàng)建任務(wù)組。

Group group = dispatcher.createDispatchGroup();

// 將任務(wù)加入任務(wù)組,返回一個(gè)用于取消任務(wù)的接口。

dispatcher.asyncGroupDispatch(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “task1 is running”); // 1

}

});

dispatcher.asyncGroupDispatch(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “task2 is running”); // 2

}

});

dispatcher.syncDispatchBarrier(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “barrier”); // 3

}

});

HiLog.info(LABEL_LOG, “after syncDispatchBarrier”); // 4

}

運(yùn)行之后查看日志:

01a4c066-1fc1-11ec-82a8-dac502259ad0.png

⑥異步設(shè)置屏障任務(wù) asyncDispatchBarrier

在任務(wù)組上設(shè)立任務(wù)執(zhí)行屏障后直接返回,指定任務(wù)將在任務(wù)組中的所有任務(wù)執(zhí)行完成后再執(zhí)行。

/**

* 異步設(shè)置屏障任務(wù)

*/

private void asyncDispatchBarrier() {

TaskDispatcher dispatcher = createParallelTaskDispatcher(“dispatcherName”, TaskPriority.DEFAULT);

// 創(chuàng)建任務(wù)組。

Group group = dispatcher.createDispatchGroup();

// 將任務(wù)加入任務(wù)組,返回一個(gè)用于取消任務(wù)的接口。

dispatcher.asyncGroupDispatch(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “task1 is running”); // 1

}

});

dispatcher.asyncGroupDispatch(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “task2 is running”); // 2

}

});

dispatcher.asyncDispatchBarrier(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “barrier”); // 3

}

});

HiLog.info(LABEL_LOG, “after asyncDispatchBarrier”); // 4

}

運(yùn)行之后查看日志:

02118cbe-1fc1-11ec-82a8-dac502259ad0.png

總結(jié)

線程它就像一面雙刃劍,用的好的時(shí)候可以給我們帶來事半功倍等效果,用的不好時(shí)就會(huì)給我們帶來困擾。

并且這個(gè)困擾還不是一時(shí)半會(huì)能解決掉的(因?yàn)榘l(fā)現(xiàn)問題的時(shí)候,往往是到了需要優(yōu)化期了,各項(xiàng)業(yè)務(wù)相互牽扯),故在項(xiàng)目初期就需要嚴(yán)格考慮考量這些問題了。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    505

    瀏覽量

    19698
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2635

    瀏覽量

    66383

原文標(biāo)題:鴻蒙的線程管理,看完渾身通透!

文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙系統(tǒng)在服裝RFID管理中的應(yīng)用:打造智能零售新時(shí)代

    鴻蒙系統(tǒng)結(jié)合RFID技術(shù),助力服裝行業(yè)智能化升級(jí),實(shí)現(xiàn)高效庫(kù)存管理、自動(dòng)化存取、全流程供應(yīng)鏈管理,以及生產(chǎn)計(jì)件管理。常達(dá)智能物聯(lián)提供高性能R
    的頭像 發(fā)表于 07-15 14:57 ?269次閱讀

    鴻蒙開發(fā):線程模型

    FA模型下的線程主要有如下三類
    的頭像 發(fā)表于 06-24 17:27 ?436次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā):<b class='flag-5'>線程</b>模型

    鴻蒙開發(fā):【線程模型】

    管理其他線程的ArkTS引擎實(shí)例,例如使用TaskPool(任務(wù)池)創(chuàng)建任務(wù)或取消任務(wù)、啟動(dòng)和終止Worker線程
    的頭像 發(fā)表于 06-13 16:38 ?423次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā):【<b class='flag-5'>線程</b>模型】

    千萬不要忽略PCB設(shè)計(jì)中線寬線距的重要性

    中線寬線距的重要性: 1. 電氣性能: 線寬和線距會(huì)影響電路板的電氣性能。線寬決定了導(dǎo)線的電阻,線距則影響信號(hào)的串?dāng)_。正確選擇線寬和線距可以確保電路板的信號(hào)完整性和穩(wěn)定性。 2. 功率傳輸和熱管理: 線寬的選擇對(duì)于功率傳輸和熱管理
    的頭像 發(fā)表于 05-29 09:31 ?947次閱讀
    千萬不要忽略PCB設(shè)計(jì)<b class='flag-5'>中線</b>寬線距的重要性

    STM32F7使用FreeRTOS,程序運(yùn)行一段時(shí)間后進(jìn)入HardFault_Handler的原因?

    )”,“精準(zhǔn)的數(shù)據(jù)訪問沖突(PRECISERR)”。 其中工程中線程共6個(gè)。線程A每秒打印時(shí)間;線程B負(fù)責(zé)串口1發(fā)送命令;線程C負(fù)責(zé)接收串口1數(shù)據(jù),并通過隊(duì)列給
    發(fā)表于 04-08 07:23

    鴻蒙原生應(yīng)用開發(fā)-ArkTS語言基礎(chǔ)類庫(kù)多線程TaskPool和Worker的對(duì)比(一)

    TaskPool偏向獨(dú)立任務(wù)維度,該任務(wù)在線程中執(zhí)行,無需關(guān)注線程的生命周期,超長(zhǎng)任務(wù)(大于3分鐘)會(huì)被系統(tǒng)自動(dòng)回收;而Worker偏向線程的維度,支持長(zhǎng)時(shí)間占據(jù)
    發(fā)表于 03-25 14:11

    什么是動(dòng)態(tài)線程池?動(dòng)態(tài)線程池的簡(jiǎn)單實(shí)現(xiàn)思路

    因此,動(dòng)態(tài)可監(jiān)控線程池一種針對(duì)以上痛點(diǎn)開發(fā)的線程管理工具。主要可實(shí)現(xiàn)功能有:提供對(duì) Spring 應(yīng)用內(nèi)線程池實(shí)例的全局管控、應(yīng)用運(yùn)行時(shí)動(dòng)態(tài)變更
    的頭像 發(fā)表于 02-28 10:42 ?650次閱讀

    純血鴻蒙系統(tǒng),拿什么與安卓、iOS比?

    ArkUI …… 2、鴻蒙進(jìn)階 Stage模型 網(wǎng)絡(luò)、數(shù)據(jù)管理 一次開發(fā)多段部署 …… 3、鴻蒙多媒體技術(shù) 音頻 視頻 相機(jī) 圖片 …… 4、鴻蒙南向與驅(qū)動(dòng)開發(fā) 物聯(lián)網(wǎng) 驅(qū)動(dòng)開發(fā) ……
    發(fā)表于 02-21 21:04

    華為鴻蒙系統(tǒng)怎么樣 華為鴻蒙系統(tǒng)和安卓系統(tǒng)的區(qū)別

    華為鴻蒙系統(tǒng)是華為公司自主研發(fā)的全場(chǎng)景分布式操作系統(tǒng),于2019年8月首次發(fā)布。鴻蒙系統(tǒng)不同于傳統(tǒng)的操作
    的頭像 發(fā)表于 02-02 14:54 ?1755次閱讀

    鴻蒙千帆起】高德地圖攜手HarmonyOS NEXT,開啟智能出行新篇章

    德團(tuán)隊(duì)的辛勤努力和不懈探索。目前,高德地圖在主圖、信息展示、規(guī)劃導(dǎo)航等基礎(chǔ)功能方面已完成了鴻蒙化,未來還將逐步在鴻蒙系統(tǒng)上實(shí)現(xiàn)更多特色功能。 在實(shí)踐分享環(huán)節(jié),宋浩波深入剖析了高德地圖在鴻蒙
    發(fā)表于 02-02 11:09

    如何在鴻蒙系統(tǒng)上安裝Google Play

    隨著鴻蒙(HarmonyOS)系統(tǒng)的逐漸普及和用戶基數(shù)的增加,一些用戶希望能在鴻蒙系統(tǒng)上使用Google Play商店以獲取更多應(yīng)用。然而,由于鴻蒙
    的頭像 發(fā)表于 01-31 17:13 ?1.6w次閱讀

    鴻蒙OS 線程管理開發(fā)指導(dǎo)

    場(chǎng)景介紹 如果應(yīng)用的業(yè)務(wù)邏輯比較復(fù)雜,可能需要?jiǎng)?chuàng)建多個(gè)線程來執(zhí)行多個(gè)任務(wù)。這種情況下,代碼復(fù)雜難以維護(hù),任務(wù)與線程的交互也會(huì)更加繁雜。要解決此問題,開發(fā)者可以使用“TaskDispatcher”來
    的頭像 發(fā)表于 01-29 16:22 ?848次閱讀

    三相四線制中中線的作用是什么

    三相四線制是一種電力供應(yīng)系統(tǒng),它由三個(gè)相互偏移120度的交流電相和一個(gè)中性線組成。中線在這種制度中起著重要的作用。下面將詳細(xì)介紹中線在三相四線制中的作用。 首先,中線在電力
    的頭像 發(fā)表于 01-18 16:52 ?6266次閱讀

    鴻蒙系統(tǒng)和安卓的區(qū)別 鴻蒙系統(tǒng)有什么特別之處

    鴻蒙系統(tǒng)是華為公司自主研發(fā)的一款全新操作系統(tǒng),旨在替代安卓系統(tǒng)鴻蒙系統(tǒng)與安卓
    的頭像 發(fā)表于 01-18 11:45 ?1.2w次閱讀

    mcu線程和進(jìn)程的區(qū)別是什么

    MCU線程和進(jìn)程是嵌入式系統(tǒng)中常見的并行執(zhí)行的概念,它們之間有許多區(qū)別,包括線程與進(jìn)程的定義、資源管理、通信機(jī)制、執(zhí)行方式等等。下面將詳細(xì)介紹MCU
    的頭像 發(fā)表于 01-04 10:45 ?766次閱讀
    主站蜘蛛池模板: 免费一看一级毛片全播放| 国产精品任我爽爆在线播放6080| 永久免费在线播放| 最新欧美一级视频| 97久久综合九色综合| 欧美三四级片| 俄罗斯小屁孩cao大人免费| 国产性夜夜性夜夜爽91| 午夜精品免费| 天天操天天做| 成人a一级毛片免费看| 欧美视频综合| 色婷婷一区二区三区四区成人 | 国产理论| 毛片免费网站| 欧美网站在线播放| 久草a视频| 来啊mm影院亚洲mm影院| 日本特级视频| 久久亚洲一级毛片| avtt国产| 久在操| 免费看一级片| 西西人体www303sw大胆高清 | 天天天天干| 69成人免费视频| 色视频色露露永久免费观看| 亚洲第一区视频在线观看| 免费欧美黄色| 59日本人xxxxxxxxx69| 一级特级aaaa毛片免费观看| 岛国毛片在线观看| 久久久久国产一级毛片高清片| 性xxx中文视频| 亚洲地址一地址二地址三| 亚洲伊人久久大香线蕉影院| 日韩a一级欧美一级| 第一福利在线| 狠狠草视频| 国产三级在线| 欧美人与动性视频在线观|