循环不是';t在java中从actionPerformed获取更新的布尔值

循环不是';t在java中从actionPerformed获取更新的布尔值,java,multithreading,awt,chat,Java,Multithreading,Awt,Chat,我正在尝试用java创建一个简单的聊天程序,使用一个框架。用户可以托管服务器(通过单击“服务器”按钮)或作为客户端连接(使用“连接”按钮)。我遇到的问题是服务器按钮。我的目标是,当单击“启动服务器”按钮时,所有其他按钮和字段都被禁用,startServer方法应该运行 整个程序都在while(!kill)循环中,现在,它只是检查isServer布尔值 while (!kill) { if (isServer) { start

我正在尝试用java创建一个简单的聊天程序,使用一个框架。用户可以托管服务器(通过单击“服务器”按钮)或作为客户端连接(使用“连接”按钮)。我遇到的问题是服务器按钮。我的目标是,当单击“启动服务器”按钮时,所有其他按钮和字段都被禁用,startServer方法应该运行

整个程序都在
while(!kill)
循环中,现在,它只是检查isServer布尔值

    while (!kill)
    {
        if (isServer)
        {
            startServer();
        }
    }
在按下StartServer按钮时执行的操作中,isServer设置为true

我的问题是startServer()永远不会运行,因为单击startServer按钮时while(!kill)循环没有获得更新的isServer值

以下是我的跑步方法:

public void run()
{   
    conversationBox.appendText("Session Start.\n");
    inputBox.requestFocus();

    while (!kill)
    {
        if (isServer)
        {
            startServer();
        }
    }       

}
以下是我的行动:

public void actionPerformed(ActionEvent e) throws NumberFormatException
{
    Object o = e.getSource();

    if (o == sendButton || o == inputBox)
    {
        if(inputBox.getText() != "")
        {
            clientSendMsg = inputBox.getText();
            inputBox.setText("");
        }
    }
    if (o == changeHost || o == hostField)
    {
        if (hostField.getText() != "" && hostField.getText() != host)
        {
            host = hostField.getText();
            conversationBox.appendText("Host changed to " + host + "\n");
        }
    }
    if (o == changePort || o == portField)
    {
        if (portField.getText() != "" && Integer.valueOf(portField.getText()) != port)
        {
            try
            {
                port = Integer.valueOf(portField.getText());
                conversationBox.appendText("Port changed to " + port + "\n");
            }
            catch(NumberFormatException up)
            {
                throw up; //blargh enter a real value
            }
        }
    }
    if (o == startServerButton)
    {
        isServer = true;
        startServerButton.enable(false);
        connectButton.enable(false);
        changeHost.enable(false);
        changePort.enable(false);
        sendButton.enable(false);
        hostField.enable(false);
        portField.enable(false);
        inputBox.enable(false);
    }
    inputBox.requestFocus();
}
显然,这个程序还远未完成,但这是一个不容忽视的巨大障碍,所以我想最好在开始之前把它修好。另外,应该注意,我有一个
新线程(this.start()在创建框架布局的
Chat()
对象内。我不能100%确定这有多有效。

在这行:
if(isServer)

如果单击按钮时,
isServer
设置为true,您的意思是说
if(isServer==true)

根据我的经验,
“if”语句应该总是有一个条件,例如
if(variable1.equals(variable2))
if(boolean==true)

或者问题可能在您的while(!kill)循环中。在这种情况下,只需取出if语句,然后查看该方法是否运行。

在这一行:
if(isServer)

如果单击按钮时,
isServer
设置为true,您的意思是说
if(isServer==true)

根据我的经验,
“if”语句应该总是有一个条件,例如
if(variable1.equals(variable2))
if(boolean==true)


或者问题可能在您的while(!kill)循环中。在这种情况下,只需取出if语句,然后查看该方法是否运行。

Java中的Volatile关键字被用作Java编译器和线程的指示符,不缓存该变量的值,并始终从主内存读取它。所以,如果您想共享任何读写操作是原子实现的变量,例如,在int或boolean变量中读写,您可以将它们声明为volatile变量

以下是一个链接:


Java中的Volatile关键字用作Java编译器和线程的指示符,不缓存此变量的值,并始终从主内存读取它。所以,如果您想共享任何读写操作是原子实现的变量,例如,在int或boolean变量中读写,您可以将它们声明为volatile变量

以下是一个链接:


你能尝试用
volatile
modififer声明
isServer
kill
字段吗?似乎
volatile kill
是必需的,所以使用volatile是有效的,但我不知道发生了什么,哈哈。你们中的哪一位在回复中发布了它,并解释了volatile做了什么,这得到了我的观点。你们可以尝试用
volatile
修改器声明
isServer
kill
字段吗?似乎需要
volatile kill
所以,使用volatile是可行的,但我不知道发生了什么,哈哈。你们中的哪一位在回答中发布了它,并解释了volatile是如何得到我的分数的。我的意思是
(isServer==true)
,但我尝试了使用和不使用
==true
,两种方法都有效。我的问题是,我需要使用如上所述的
volatile
关键字。不管怎样,谢谢你的回答!我的意思是
(isServer==true)
,但是我尝试了使用
==true
和不使用
==true
两种方法,结果都奏效了。我的问题是,我需要使用如上所述的
volatile
关键字。不管怎样,谢谢你的回答!但也要注意不必要地使用
volatile
也不好,因为它需要大量操作(CPU周期),但也要注意不必要地使用
volatile
也不好,因为它需要大量操作(CPU周期)