溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java線程的應(yīng)用場景有哪些

發(fā)布時間:2021-11-23 10:39:54 來源:億速云 閱讀:150 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“java線程的應(yīng)用場景有哪些”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“java線程的應(yīng)用場景有哪些”這篇文章吧。

解決生產(chǎn)者,消費者存在問題,可使用如下方法(代碼示例包含):

1.  解決數(shù)據(jù)同步問題:使用同步代碼塊;

2. 解決重復(fù)問題:

    加入等待與喚醒機制-->由Object類提供方法:

等待:public final void wait() throws InterruptedException

喚醒第一個等待線程:public final void notify();

喚醒全部等待線程:public final void notifyAll();

代碼示例:

**
 * 生產(chǎn)者消費者實體
 * YangKuo 2018/11/15 18:21
 */
public class Info {

    private String title;

    private String content;

    /**
     * flag=true 表示可以生產(chǎn),但不能取走
     * flag=false 表示不能生產(chǎn),可以取走
     */
    private Boolean flag = true;

    public synchronized void setInfo(String title, String content) throws InterruptedException {
        if (!flag) {//此時不能夠進行生產(chǎn),等待取走
            super.wait();
        }
        Thread.sleep(100);
        this.title = title;
        this.content = content;
        flag = false;//生產(chǎn)完成
        super.notify();

    }

    public synchronized void getInfo() throws InterruptedException {
        if (flag) {//此時應(yīng)該生產(chǎn),不應(yīng)該取走
            super.wait();//等待
        }
        Thread.sleep(100);
        System.out.println(this.title + "----->" + this.content);
        flag = true;//消費完成
        super.notify();
    }

}

/**
 * 生產(chǎn)者
 * YangKuo 2018/11/15 18:26
 */
public class Producer implements Runnable {

    private Info info;

    public Producer(Info info) {
        this.info = info;
    }

    @Override
    public void run() {
        for (int x = 0; x < 50; x++) {
            if (x % 2 == 0) {
                try {
                    info.setInfo("張三","一個帥哥");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                try {
                    info.setInfo("小白兔","一個可愛的小動物");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

/**
 * 消費者
 * YangKuo 2018/11/15 18:26
 */
public class Customer implements Runnable {

    private Info info;

    public Customer(Info info) {
        this.info = info;
    }

    @Override
    public void run() {
        for (int x = 0; x < 50; x++) {
            try {
                info.getInfo();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

/**
 * 生產(chǎn)者,消費者測試
 * YangKuo 2018/11/15 18:35
 */
public class Test {

    public static void main(String args[]) {
        Info info = new Info();
        Producer p = new Producer(info);
        Customer c = new Customer(info);
        new Thread(p).start();
        new Thread(c).start();
    }
}

補充:wait()與Sleep方法的區(qū)別

wait(): Object類定義的方法,表示線程要等待執(zhí)行,必須通過notify(),notifyAll()方法喚醒

Sleep(): 是Thread類定義的方法,在休眠到一定時間后將自己喚醒。

以上是“java線程的應(yīng)用場景有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI