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

JAVAEE-定時(shí)器案例

這篇具有很好參考價(jià)值的文章主要介紹了JAVAEE-定時(shí)器案例。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

設(shè)置一個(gè)時(shí)間,當(dāng)時(shí)間到了的時(shí)候,定時(shí)器就會(huì)去自動(dòng)執(zhí)行某個(gè)邏輯.

timer簡(jiǎn)介

1.創(chuàng)建計(jì)時(shí)器

Timer timer=new Timer();//創(chuàng)建計(jì)時(shí)器

2.創(chuàng)建任務(wù)

timer.schedule(new TimerTask(){//接口,這里不能使用lambada表達(dá)式,lambada表達(dá)式要求接口只有一個(gè)函數(shù),這里有多個(gè)
public void run(){
System.out.println("hello 1000");
}

},1000);//第二個(gè)參數(shù)是推遲時(shí)間,delay,計(jì)時(shí)器創(chuàng)建好之后,什么時(shí)候進(jìn)行執(zhí)行

3.關(guān)掉計(jì)時(shí)器

timer.cancel();//停掉計(jì)時(shí)器,未執(zhí)行的任務(wù)停止

這里timer里面的任務(wù)執(zhí)行完了也并不會(huì)結(jié)束,因?yàn)樗⒉恢朗欠襁€會(huì)添加新的任務(wù)進(jìn)去,

處在嚴(yán)陣以待的狀態(tài)

此時(shí)如果我們想要結(jié)束,應(yīng)該使用cancel主動(dòng)去結(jié)束.

完整代碼:

package thread;

import java.lang.annotation.Target;
import java.util.Timer;
import java.util.TimerTask;

public class ThreadDemo27 {
    public static void main(String[] args) throws InterruptedException {
        Timer timer=new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello 3000");
            }
        },3000);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello 2000");
            }
        },2000);

     timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("hello 1000");
        }
    },1000);
        System.out.println("hello main");
        Thread.sleep(5000);
        timer.cancel();
}
    }



JAVAEE-定時(shí)器案例,java,開(kāi)發(fā)語(yǔ)言

Timer里面的內(nèi)容

1)需要有一個(gè)線程,負(fù)責(zé)掐時(shí)間,等任務(wù)到達(dá)合適的時(shí)間,這個(gè)線程就負(fù)責(zé)執(zhí)行

還需要有一個(gè)隊(duì)列/數(shù)組,能夠保存所有schedule進(jìn)來(lái)的任務(wù)

直觀的想,就是這個(gè)線程需要不斷的去掃描上述隊(duì)列中的每個(gè)任務(wù)是否到時(shí)間了,到時(shí)間了就需要去執(zhí)行.

在這里每個(gè)任務(wù)都是帶有delay時(shí)間的,肯定是先執(zhí)行時(shí)間小的,后執(zhí)行時(shí)間大的,我們可以使用優(yōu)先級(jí)隊(duì)列,只需要關(guān)注隊(duì)首元素是否到時(shí)間,如果到時(shí)間了,就需要進(jìn)行執(zhí)行,

在此處,我們使用PriortyQueue(線程不安全,需要我們主動(dòng)加鎖控制),

PriorityBlockingQueue(線程安全)在此處場(chǎng)景中,不太好控制,容易出問(wèn)題

自定義計(jì)時(shí)器:

1.首先我們先定義一個(gè)類(lèi),用來(lái)存放時(shí)間和任務(wù).

class MYTIMETASK{
    private Runnable runnable;//此處為執(zhí)行的任務(wù)代碼
    private long time;//此處為執(zhí)行任務(wù)的時(shí)間,此處的時(shí)間是一個(gè)相對(duì)時(shí)間,此處的時(shí)間是一個(gè)ms級(jí)別的時(shí)間戳
    //構(gòu)造方法
    //獲取時(shí)間的方法
    public long getTime(){
        return  this.time;
    }
    //提供任務(wù)執(zhí)行的接口
    public void run(){
        this.runnable.run();
    }
    public MYTIMETASK(Runnable runnable,long delay){
        this.runnable=runnable;
        this.time=System.currentTimeMillis()+delay;
    }
}

但是我們?cè)诙x計(jì)時(shí)器MYTIME這個(gè)類(lèi)的時(shí)候,需要用一個(gè)優(yōu)先級(jí)隊(duì)列來(lái)進(jìn)行存儲(chǔ)task任務(wù),因此task必須是可以進(jìn)行比較的,不然會(huì)報(bào)錯(cuò),因此,task這個(gè)類(lèi)就要實(shí)現(xiàn)Comparable這個(gè)接口

這是改進(jìn)后的MTTIMETASK類(lèi)


/**
 * 用來(lái)存放執(zhí)行的時(shí)間和任務(wù)
 */
class MYTIMETASK implements  Comparable<MYTIMETASK>{
    private Runnable runnable;//此處為執(zhí)行的任務(wù)代碼
    private long time;//此處為執(zhí)行任務(wù)的時(shí)間,此處的時(shí)間是一個(gè)相對(duì)時(shí)間,此處的時(shí)間是一個(gè)ms級(jí)別的時(shí)間戳
    //構(gòu)造方法
    //獲取時(shí)間的方法
    public long getTime(){
        return  this.time;
    }
    //提供任務(wù)執(zhí)行的接口
    public void run(){
        this.runnable.run();
    }
    public MYTIMETASK(Runnable runnable,long delay){
        this.runnable=runnable;
        this.time=System.currentTimeMillis()+delay;
    }

    @Override
    public int compareTo(MYTIMETASK o) {
        return (int)(this.time-o.time);//這里是long類(lèi)型,要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換
    }
}

這是MYTIMER類(lèi)的實(shí)現(xiàn)

class MYTIMER{
    private Thread t=null;//定義一個(gè)線程來(lái)不斷地進(jìn)行掃描,看是否有任務(wù)到時(shí)間了,不斷地去掃描
    private PriorityQueue<MYTIMETASK>queue=new PriorityQueue<>();//此處定義一個(gè)優(yōu)先級(jí)隊(duì)列來(lái)存放任務(wù),
    //但是這里需要注意,我們的優(yōu)先級(jí)隊(duì)列在進(jìn)行存儲(chǔ)自定義數(shù)據(jù)時(shí),需要實(shí)現(xiàn)Comparable接口方法.,因此上述代碼應(yīng)做出改動(dòng)
    public void schedule(Runnable runnable,long delay){//使用schedule進(jìn)行任務(wù)的添加
        MYTIMETASK task=new MYTIMETASK(runnable,delay);
        queue.offer(task);//進(jìn)行任務(wù)的添加
    }
    //在構(gòu)造方法里面創(chuàng)建一個(gè)線程來(lái)進(jìn)行掃描,嚴(yán)陣以待
    public MYTIMER(){
        t=new Thread(()->{
            while(true){
                if(queue.isEmpty())
                {
                    continue;//如果隊(duì)列為空,則不能進(jìn)行peek,要循環(huán)到有任務(wù)進(jìn)來(lái)了,才可以執(zhí)行當(dāng)前邏輯
                }
                //如果不為空,我們則需要查看隊(duì)列頂部的任務(wù)是否到了執(zhí)行的時(shí)間
                MYTIMETASK task=queue.peek();
                if(System.currentTimeMillis()>=task.getTime()){
                    task.run();//到了執(zhí)行任務(wù)的時(shí)間,則需要進(jìn)行執(zhí)行
                    queue.poll();//執(zhí)行了則需要進(jìn)行出隊(duì)列操作
                }

            }
        });
        t.start();//開(kāi)啟這個(gè)線程
    }

}

但是這里面仍然有不足的地方..

首先這是一個(gè)多線程,我們就要查看是否設(shè)計(jì)線程安全問(wèn)題.

當(dāng)構(gòu)造方法的t線程和主線程在調(diào)用schedule方法時(shí),兩個(gè)線程會(huì)同時(shí)對(duì)queue這個(gè)隊(duì)列進(jìn)行操作.

JAVAEE-定時(shí)器案例,java,開(kāi)發(fā)語(yǔ)言

如上圖而言,這樣就會(huì)出現(xiàn)線程不安全,因此我們要給他們進(jìn)行加鎖.

加上鎖了之后,線程是安全了,但是還有一個(gè)問(wèn)題.

JAVAEE-定時(shí)器案例,java,開(kāi)發(fā)語(yǔ)言?

當(dāng)隊(duì)列一開(kāi)始為空的時(shí)候,有圖中的線程會(huì)一直執(zhí)行while循環(huán),每次都會(huì)快速的解鎖,但是他每次都會(huì)先一步左邊的線程拿到鎖,因?yàn)樽筮叺逆i是處于沉睡的狀態(tài),才被喚醒會(huì)競(jìng)爭(zhēng)不過(guò)右邊的線程,那么就會(huì)造成一直都是右邊的線程拿到鎖,但是又無(wú)法繼續(xù)執(zhí)行下去.這種情況,我們就應(yīng)該使用wait方法,讓右邊的線程主動(dòng)進(jìn)入WAITING阻塞狀態(tài),主動(dòng)放棄鎖的競(jìng)爭(zhēng),給左邊的線程一點(diǎn)時(shí)間,等到左邊的線程放進(jìn)了任務(wù)的時(shí)候,再去通知右邊線程去執(zhí)行.

JAVAEE-定時(shí)器案例,java,開(kāi)發(fā)語(yǔ)言相同的道理,如果此時(shí)右側(cè)隊(duì)列的第一個(gè)任務(wù)的時(shí)間過(guò)于長(zhǎng)的話,他就會(huì)一直爭(zhēng)奪鎖,因此我們也要給他設(shè)置一個(gè)帶時(shí)間的wait方法,不然左邊的線程在他一直循環(huán)爭(zhēng)奪鎖的過(guò)程是拿不到鎖的.

最終完整代碼:


/**
 * 用來(lái)存放執(zhí)行的時(shí)間和任務(wù)
 */
class MYTIMETASK implements  Comparable<MYTIMETASK>{
    private Runnable runnable;//此處為執(zhí)行的任務(wù)代碼
    private long time;//此處為執(zhí)行任務(wù)的時(shí)間,此處的時(shí)間是一個(gè)相對(duì)時(shí)間,此處的時(shí)間是一個(gè)ms級(jí)別的時(shí)間戳
    //構(gòu)造方法
    //獲取時(shí)間的方法
    public long getTime(){
        return  this.time;
    }
    //提供任務(wù)執(zhí)行的接口
    public void run(){
        this.runnable.run();
    }
    public MYTIMETASK(Runnable runnable,long delay){
        this.runnable=runnable;
        this.time=System.currentTimeMillis()+delay;
    }

    @Override
    public int compareTo(MYTIMETASK o) {
        return (int)(this.time-o.time);//這里是long類(lèi)型,要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換
    }
}

/**
 * 計(jì)時(shí)器,用來(lái)判斷當(dāng)前哪一個(gè)任務(wù)該執(zhí)行了
 */
class MYTIMER{
    private Thread t=null;//定義一個(gè)線程來(lái)不斷地進(jìn)行掃描,看是否有任務(wù)到時(shí)間了,不斷地去掃描
    private PriorityQueue<MYTIMETASK>queue=new PriorityQueue<>();//此處定義一個(gè)優(yōu)先級(jí)隊(duì)列來(lái)存放任務(wù),
    //但是這里需要注意,我們的優(yōu)先級(jí)隊(duì)列在進(jìn)行存儲(chǔ)自定義數(shù)據(jù)時(shí),需要實(shí)現(xiàn)Comparable接口方法.,因此上述代碼應(yīng)做出改動(dòng)
    private Object locker1=new Object();
    public void schedule(Runnable runnable,long delay){//使用schedule進(jìn)行任務(wù)的添加
        synchronized (locker1) {
            MYTIMETASK task = new MYTIMETASK(runnable, delay);
            queue.offer(task);//進(jìn)行任務(wù)的添加
            locker1.notify();
        }
    }
    
    //提供一個(gè)cancel方法來(lái)進(jìn)行計(jì)時(shí)器任務(wù)的結(jié)束
    public void cancel(){
        t.interrupt();
    }
    //在構(gòu)造方法里面創(chuàng)建一個(gè)線程來(lái)進(jìn)行掃描,嚴(yán)陣以待
    public MYTIMER(){
        t=new Thread(()->{
            while(!Thread.currentThread().isInterrupted()){
                try {
                    synchronized (locker1) {
                        while (queue.isEmpty()) {
                            locker1.wait();
                            //continue;//如果隊(duì)列為空,則不能進(jìn)行peek,要循環(huán)到有任務(wù)進(jìn)來(lái)了,才可以執(zhí)行當(dāng)前邏輯
                        }
                        //如果不為空,我們則需要查看隊(duì)列頂部的任務(wù)是否到了執(zhí)行的時(shí)間
                        MYTIMETASK task = queue.peek();
                        if (System.currentTimeMillis() >= task.getTime()) {
                            task.run();//到了執(zhí)行任務(wù)的時(shí)間,則需要進(jìn)行執(zhí)行
                            queue.poll();//執(zhí)行了則需要進(jìn)行出隊(duì)列操作
                        }
                        else{
                            locker1.wait(task.getTime()-System.currentTimeMillis());
                //此處的wait有兩種方式,一種是當(dāng)沒(méi)有任務(wù)添加進(jìn)來(lái)的時(shí)候,這個(gè)線程會(huì)一直等到//時(shí)間到了繼續(xù)再去執(zhí)行,
//另外一種是又有新添加的任務(wù),這個(gè)線程要掃描當(dāng)前任務(wù)時(shí)間最近的線程,這個(gè)新添加的任務(wù)就有可能是最近時(shí)間最接近的任務(wù)

                        }
                    }
                }
                catch (InterruptedException e){
                        break;
                }

            }
        });
        t.start();//開(kāi)啟這個(gè)線程
    }

}

測(cè)試代碼:

public class Main{

    public static void main(String[] args) throws InterruptedException {
  MYTIMER timer=new MYTIMER();
  timer.schedule(new Runnable() {
      @Override
      public void run() {
          System.out.println("hello 3000");
      }
  },3000);
        timer.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello 2000");
            }
        },2000);
        timer.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello 1000");
            }
        },1000);
        Thread.sleep(5000);
        timer.cancel();
    }
}

運(yùn)行結(jié)果:?

JAVAEE-定時(shí)器案例,java,開(kāi)發(fā)語(yǔ)言

以上就是計(jì)時(shí)器的自我實(shí)現(xiàn),感謝各位大佬的三連.文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-755427.html

到了這里,關(guān)于JAVAEE-定時(shí)器案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【javaEE】阻塞隊(duì)列、定時(shí)器、線程池

    【javaEE】阻塞隊(duì)列、定時(shí)器、線程池

    目錄 ??一、阻塞隊(duì)列 1.概念 2.生產(chǎn)者消費(fèi)者模型 3.阻塞隊(duì)列的實(shí)現(xiàn) ??二、定時(shí)器 1.引出定時(shí)器 2.定時(shí)器的實(shí)現(xiàn) ??三、線程池 1.引出線程池 2.ThreadPoolExecutor 構(gòu)造方法 3.標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)的4種拒絕策略【經(jīng)典面試題】【重點(diǎn)掌握】 4.線程池的實(shí)現(xiàn) ? 1.概念 ?對(duì)于隊(duì)列,首先我們想

    2023年04月21日
    瀏覽(20)
  • 【JavaEE初階】 定時(shí)器詳解與實(shí)現(xiàn)

    【JavaEE初階】 定時(shí)器詳解與實(shí)現(xiàn)

    定時(shí)器也是軟件開(kāi)發(fā)中的一個(gè)重要組件. 類(lèi)似于一個(gè) “鬧鐘”. 達(dá)到一個(gè)設(shè)定的時(shí)間之后, 就執(zhí)行某個(gè)指定好的代碼 定時(shí)器是一種實(shí)際開(kāi)發(fā)中非常常用的組件. 比如網(wǎng)絡(luò)通信中, 如果對(duì)方 500ms 內(nèi)沒(méi)有返回?cái)?shù)據(jù), 則斷開(kāi)連接嘗試重連. 比如一個(gè) Map, 希望里面的某個(gè) key 在 3s 之后過(guò)

    2024年02月06日
    瀏覽(20)
  • 【JavaEE初階】多線程(四)阻塞隊(duì)列 定時(shí)器 線程池

    【JavaEE初階】多線程(四)阻塞隊(duì)列 定時(shí)器 線程池

    概念 阻塞隊(duì)列是一種特殊的隊(duì)列. 也遵守 “ 先進(jìn)先出 ” 的原則. 阻塞隊(duì)列能是一種線程安全的數(shù)據(jù)結(jié)構(gòu), 并且具有以下特性: 當(dāng)隊(duì)列滿(mǎn)的時(shí)候, 繼續(xù)入隊(duì)列就會(huì)阻塞, 直到有其他線程從隊(duì)列中取走元素. 當(dāng)隊(duì)列空的時(shí)候, 繼續(xù)出隊(duì)列也會(huì)阻塞,直到有其他線程往隊(duì)列中插入元素

    2023年04月26日
    瀏覽(19)
  • 多線程案例(3)-定時(shí)器

    大家好,我是曉星航。今天為大家?guī)?lái)的是 多線程案例三 相關(guān)的講解!?? 定時(shí)器是什么 定時(shí)器也是軟件開(kāi)發(fā)中的一個(gè)重要組件. 類(lèi)似于一個(gè) “鬧鐘”. 達(dá)到一個(gè)設(shè)定的時(shí)間之后, 就執(zhí)行某個(gè)指定 好的代碼. 定時(shí)器是一種實(shí)際開(kāi)發(fā)中非常常用的組件. 比如網(wǎng)絡(luò)通信中, 如果對(duì)方

    2024年02月14日
    瀏覽(17)
  • STM32自學(xué)?定時(shí)器外部時(shí)鐘案例

    本案例主要是通過(guò)外部時(shí)鐘實(shí)現(xiàn)對(duì)射式紅外傳感器的計(jì)次,在oled顯示屏上顯示CNT的次數(shù) #include \\\"stm32f10x.h\\\" #include \\\"stm32f10x_tim.h\\\" #include \\\"timer_interrupt.h\\\" #include \\\"stdint.h\\\" //初始化函數(shù) void Timer_Init(void) { ?/*開(kāi)啟時(shí)鐘*/ ?RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //開(kāi)啟TIM2的時(shí)鐘 ?RCC_A

    2024年02月22日
    瀏覽(32)
  • 【Linux】Linux定時(shí)器使用及代碼案例

    在 Linux 中,可以使用定時(shí)器來(lái)實(shí)現(xiàn)一些定時(shí)任務(wù),例如定時(shí)發(fā)送信號(hào)、定時(shí)執(zhí)行某個(gè)函數(shù)等。定時(shí)器的初始化通常包括以下幾個(gè)步驟: 定義定時(shí)器結(jié)構(gòu)體:首先需要定義一個(gè)定時(shí)器結(jié)構(gòu)體,用于存儲(chǔ)定時(shí)器的相關(guān)信息。在 Linux 中,可以使用 timer_t 類(lèi)型來(lái)表示定時(shí)器結(jié)構(gòu)體。

    2024年02月04日
    瀏覽(23)
  • 多線程案例 | 單例模式、阻塞隊(duì)列、定時(shí)器、線程池

    多線程案例 | 單例模式、阻塞隊(duì)列、定時(shí)器、線程池

    單例模式 單例模式是 設(shè)計(jì)模式 的一種 什么是設(shè)計(jì)模式? 設(shè)計(jì)模式好比象棋中的 “棋譜”,紅方當(dāng)頭炮,黑方馬來(lái)跳,針對(duì)紅方的一些走法,黑方應(yīng)招的時(shí)候有一些固定的套路,按照套路來(lái)走局勢(shì)就不會(huì)吃虧,也就發(fā)明了一組\\\"棋譜\\\",稱(chēng)為設(shè)計(jì)模式 軟件開(kāi)發(fā)中也有很多常見(jiàn)

    2024年02月15日
    瀏覽(26)
  • C語(yǔ)言實(shí)現(xiàn)定時(shí)器

    代碼解釋?zhuān)?#include stdio.h #include windows.h 這兩行是引入所需的標(biāo)準(zhǔn)庫(kù)頭文件。 void CALLBACK timer_handler(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { ? ? printf(\\\"Timer expired!n\\\"); } 定義了一個(gè)回調(diào)函數(shù) timer_handler,當(dāng)定時(shí)器到期時(shí)會(huì)被調(diào)用。在此示例中,它只簡(jiǎn)單地打印一條消息表示定時(shí)

    2024年02月12日
    瀏覽(15)
  • 學(xué)習(xí)筆記|定時(shí)器|STC中斷|定時(shí)器時(shí)間計(jì)算|STC32G單片機(jī)視頻開(kāi)發(fā)教程(沖哥)|第十一集:定時(shí)器的作用和意義

    學(xué)習(xí)筆記|定時(shí)器|STC中斷|定時(shí)器時(shí)間計(jì)算|STC32G單片機(jī)視頻開(kāi)發(fā)教程(沖哥)|第十一集:定時(shí)器的作用和意義

    什么是定時(shí)器:定時(shí)器-與非網(wǎng) 上節(jié)課的一段代碼: TimeCount++然后一個(gè)延時(shí)1毫秒,每運(yùn)行1ms,變量就會(huì)加一。 系統(tǒng)已經(jīng)運(yùn)行了多少個(gè)毫秒。 實(shí)際使用時(shí)的代碼如下, 判斷按鍵有沿有按下的時(shí)候,我們等待按鍵松開(kāi),還有一個(gè)while循環(huán)。 如果沒(méi)有松開(kāi),會(huì)一直死在這一行。所以,

    2024年02月09日
    瀏覽(27)
  • Java定時(shí)器

    Java定時(shí)器

    目錄 什么是定時(shí)器? 如何使用定時(shí)器? schedule Timer的構(gòu)造方法 cancel 定時(shí)器的模擬實(shí)現(xiàn) 思路分析 實(shí)現(xiàn)過(guò)程 完整代碼 定時(shí)器: 即在設(shè)定的時(shí)間時(shí)執(zhí)行某事的設(shè)備(例如鬧鐘,在指定的時(shí)間響鈴),Java中的定時(shí)器會(huì)在到達(dá)設(shè)定的時(shí)間后,執(zhí)行指定的代碼 Java標(biāo)準(zhǔn)庫(kù)中提供了一

    2024年02月03日
    瀏覽(14)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包