为了账号安全,请及时绑定邮箱和手机立即绑定

Java:在线程之间共享和调用变量

Java:在线程之间共享和调用变量

哔哔one 2021-08-04 17:37:30
我使用套接字制作了一个基本服务器,并想添加一个简单的 GUI 来打开和关闭它。为了在服务器运行 while 循环时使 GUI 仍然工作,我为套接字创建了一个线程。现在我在想的是向那个 while 循环添加一个布尔值,该循环退出所述循环并在按下 GUI 中的按钮时导致服务器停止。现在的问题是布尔值是在GUI线程中设置的,需要在服务器线程中调用。我阅读了有关将布尔值设置为 volatile 或使用 AtomicBoolean 的内容,但它们似乎都不起作用。从服务器线程调用布尔值时,我是否需要寻找一些特别的东西?这是我到目前为止编写的(简化的)代码:public class GUI {    private static int port = 12345;        private static volatile boolean online = false;         public static void main(String[] args) {        //GUI works so i left the code out        //Basically generates a button giving it the actionlistener below    }    private static ActionListener getActionListener() {        return new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                if(!online) {                    online = true;                    Thread serverThread = new Thread(new ServerThread());                    serverThread.start();                } else {                    online = false;                                 }                           }        };    }    public static boolean getOnlineState() {        return online;    }    public static int getPort() {        return port;    }}以及包含服务器线程的类:public class ServerThread implements Runnable {    @Override    public void run() {        try {            ServerSocket serSoc = new ServerSocket(GUI.getPort());            Socket cliSoc = serSoc.accept();            PrintWriter  out = new PrintWriter(cliSoc.getOutputStream(), true);            BufferedReader in = new BufferedReader(new    InputStreamReader(cliSoc.getInputStream()));            String input;            while(GUI.getOnlineState()) {                while((input = in.readLine()) != null) {                    out.println(input);                }            }由于我对所有这些多线程的东西都不熟悉,因此如果您能告诉我,我会很高兴地发现其他一些错误。
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

嵌套循环是个问题:


while(GUI.getOnlineState()) {

    while((input = in.readLine()) != null) {

        out.println(input);

    }

}

一旦进入内循环,它将继续循环,直到输入流不再工作,您将无法摆脱它。也许更好的是完全摆脱外部循环并结合您的逻辑:


while(GUI.getOnlineState() && (input = in.readLine()) != null) {

    out.println(input);

}

其他不相关的问题是您对静态字段和方法的过度依赖,这可能适用于小型玩具程序,但随着您的程序变得更大并且可能有更多错误,这可能会增加问题。静态可能会增加不应该连接的事物的连接性,增加代码的圈复杂度,从而增加出现错误的风险。将您的关注点隔离到私有实例字段和所需的最少公共方法中。


查看完整回答
反对 回复 2021-08-04
  • 1 回答
  • 0 关注
  • 240 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信