第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java - 如何使用Java Swing手動控制哪個線程進(jìn)入臨界區(qū)?

java - 如何使用Java Swing手動控制哪個線程進(jìn)入臨界區(qū)?

大話西游666 2022-10-20 17:15:24
我正在嘗試創(chuàng)建一個簡單的基于 Java Swing 的應(yīng)用程序,該應(yīng)用程序手動控制兩個線程,這兩個線程都試圖不斷增加一個整數(shù)值。應(yīng)用程序應(yīng)該能夠“啟動”和“停止”任一線程(兩個線程同時遞增值)并將任一線程置于臨界區(qū)(僅允許一個線程遞增值)。這是我所擁有的屏幕截圖,以便您更好地理解我的目標(biāo):https://i.imgur.com/sQueUD7.png我創(chuàng)建了一個“Incrementor”類來完成遞增 int 值的工作,但是如果我嘗試將 synchronized 關(guān)鍵字添加到 increment() 方法,我不會得到我想要的結(jié)果。    private void increment() {        while (Thread.currentThread().isAlive()) {            if (Thread.currentThread().getName().equals("Thread 1")) {                if (t1Stop.isEnabled()) {                    value++;                    t1TextField.setText("Thread 1 has incremented value by 1. Current value = " + value + "\n");                }            } else if (Thread.currentThread().getName().equals("Thread 2")) {                if (t2Stop.isEnabled()) {                    value++;                    t2TextField.setText("Thread 2 has incremented value by 1. Current value = " + value + "\n");                }            }            try {                Thread.sleep(1000);            } catch (InterruptedException ex) {                ex.printStackTrace();            }        }    }關(guān)于如何進(jìn)行的任何建議?我希望我已經(jīng)明確了我在尋找什么,如果沒有,請告訴我,我會更新這篇文章。
查看完整描述

2 回答

?
人到中年有點甜

TA貢獻(xiàn)1895條經(jīng)驗 獲得超7個贊

你的問題是可怕的線程鎖!

但是如果我嘗試將 synchronized 關(guān)鍵字添加到 increment() 方法,我不會得到我想要的結(jié)果。

當(dāng)然 !線程管理器隨時更改“工作”線程!,您應(yīng)該在此處發(fā)布更多代碼,但乍一看,您在兩個線程中運行相同的方法,因此它將下降到 2 種情況:-

  1. 好案例!線程管理器在完成調(diào)用增量方法后更改線程(兩個線程的好老雙贏^-^)。

  2. 糟糕的情況(這就是您所面臨的)想象一個線程訪問了該方法,并且在完成該方法之前,線程管理器更改了它,并且當(dāng)另一個方法嘗試訪問它時,發(fā)現(xiàn)synchronized它面臨著鎖其他線程!從這里他們不能保證會發(fā)生什么,但我可以向你保證,這種情況下 90% 的結(jié)果只會讓線程管理器滿意。

應(yīng)用程序應(yīng)該能夠“啟動”和“停止”任一線程(兩個線程同時遞增值)并將任一線程置于臨界區(qū)(僅允許一個線程遞增值)。

很抱歉打擾您,但線程管理器是無法控制的,我的朋友。但是我們可以向線程管理器建議相當(dāng)多的事情,所以你想要實現(xiàn)的目標(biāo)在 java 線程管理器中是不可能的。

并停止線程的 ooky dooky ,但是在停止線程后啟動線程是大不!

Thread.start()文檔

多次啟動一個線程是不合法的。特別是,線程一旦完成執(zhí)行就可能不會重新啟動。

如果線程已經(jīng)啟動,則拋出 IllegalThreadStateException。

這是一個非常豐富的鏈接,您可以在 oracle 上更廣泛地解釋該主題


查看完整回答
反對 回復(fù) 2022-10-20
?
SMILET

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊

synchronized您可以使用關(guān)鍵字來使用對象級鎖。


=>對象級鎖:To synchronize a non static method or block so that it can be accessed by only one thread at a time for that instance. It is used to protect non static data.


例子 :


public class ClasswithCriticalSections {

    private AtomicInteger count = new AtomicInteger(0);

    public synchronized int increment() {

      count.incrementAndGet();

      return count;

    }

}

或者


public class ClasswithCriticalSections {

    Object lock1 = new Object();

    Object lock2 = new Object(); 

    private AtomicInteger count = new AtomicInteger(0);

    public int increment() {

      synchronized(lock1) {

         count.incrementAndGet();

         return count;

      }

    }

    public int decrement() {

      synchronized(lock2) {

         count.addAndGet(-1);

         return count;

      }

    }

}


查看完整回答
反對 回復(fù) 2022-10-20
  • 2 回答
  • 0 關(guān)注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號