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

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

If..Else 語句在 JFrame 程序中行為不可預(yù)測(不確定?)

If..Else 語句在 JFrame 程序中行為不可預(yù)測(不確定?)

倚天杖 2023-03-09 16:54:07
編輯:一個用戶標(biāo)記我的問題可能是這個問題的重復(fù):“ What is the volatile keyword useful for ”,其標(biāo)題是“What is the volatile keyword useful for?”。我讀了這個問題,但我不明白它與我的問題有什么關(guān)系。這是一個用兩個 .java 文件編寫的程序。我的問題涉及主要方法中的 if..else..。請注意在下面的代碼中,else {..} 中的單行被注釋掉了。我將這個程序稱為“版本 1”,我將在“版本 2”中將該行注釋掉的程序稱為該程序。// -------------// The code below is in IfElseBugProgram.javapublic class IfElseBugProgram {    public static void main(String[] args) {        MyJFrame terminal = new MyJFrame();        while (true) {            String keyReleased = terminal.getKeyReleased();            if (! keyReleased.equals("") )            {                System.out.print("@" + keyReleased);            }            else            {                // System.out.print("!" + keyReleased);            }        }     }}// ----- //The code below is in file MyJFrame.javaimport javax.swing.JFrame;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.ArrayList;import java.util.List;public class MyJFrame extends JFrame implements KeyListener{    private List<KeyEvent> keyEventQueue;    public MyJFrame()    {        keyEventQueue = new ArrayList<KeyEvent>();        this.addKeyListener(this);        pack();        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        this.setVisible(true);    }    public void keyPressed(KeyEvent e)    {    }    public void keyTyped(KeyEvent e)    {    }    public void keyReleased(KeyEvent keyEvent)    {        keyEventQueue.add(keyEvent);        System.out.println("some key was released!" + keyEventQueue.size());    }我希望 if {...} 中的代碼在我按下鍵盤上的某個鍵后運行。也就是說,我希望 System.out.print("@" + keyReleased); 代碼在我按下一個鍵時立即運行。使用版本 1,我似乎永遠不會System.out.print("@" + keyReleased);被運行;控制臺中永遠不會打印“@1”或“@2”或“@3”等。對于版本 2(即 else {..} 塊中的代碼重新注釋),通常發(fā)生的是打印出“!”的打印語句。重復(fù)運行,直到我按下一個鍵。那時,諸如“@1”或“@2”之類的東西會被重復(fù)打印。有時發(fā)生的是我沒有得到“!” 也沒有打印出“@1”或“@2”?。ㄊ褂孟嗤脑创a!)問題:為什么System.out.print("@" + keyReleased);if {..} 塊中的行在版本 1 中不運行,但(通常)在版本 2 中運行?
查看完整描述

2 回答

?
富國滬深

TA貢獻1790條經(jīng)驗 獲得超9個贊

通過假定變量不會被并發(fā)線程修改,Java VM 可以優(yōu)化連續(xù)的、非同步的加載。

如果你想在一個將被另一個線程更改的字段上進行自旋循環(huán),你可以讓虛擬機通過將其標(biāo)記為來確保每次讀取都能看到最新的更改volatile

private volatile List<KeyEvent> keyEventQueue;

正如 JLS 所說

對 volatile 字段 (§8.3.1.4) 的寫入發(fā)生在對該字段的每次后續(xù)讀取之前。

我不知道你的 V2 是否保證按照 JLS 工作,但System.out PrintStream每次寫入時都會同步,從而限制允許 VM 進行的優(yōu)化。


查看完整回答
反對 回復(fù) 2023-03-09
?
瀟瀟雨雨

TA貢獻1833條經(jīng)驗 獲得超4個贊

您遇到這種不可預(yù)測的行為的主要原因是因為您實際上創(chuàng)建了一個多線程程序,您在其中從event dispatching thread以外的線程訪問 Swing 組件。

具體行:

MyJFrame terminal = new MyJFrame();

啟動 Swing 事件調(diào)度線程但行(例如):

String keyReleased = terminal.getKeyReleased();

terminal從主線程訪問(Swing 組件)。

來自Swing 包文檔

一般來說,Swing 不是線程安全的。除非另有說明,否則所有 Swing 組件和相關(guān)類都必須在事件調(diào)度線程上訪問。

在繼續(xù)嘗試使此代碼工作之前,我建議您閱讀教程課程:Swing 中的并發(fā)。


查看完整回答
反對 回復(fù) 2023-03-09
  • 2 回答
  • 0 關(guān)注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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