【发布时间】:2020-08-04 08:19:04
【问题描述】:
我已经更新了这个问题,我创建了一个有以下问题的简单程序。
这是有效的版本代码:
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main {
static boolean readytoconnect = false;
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
JPanel panel = new JPanel();
frame.add(panel);
panel.setBounds(0, 0, frame.getWidth(), frame.getHeight());
panel.setBackground(Color.lightGray);
panel.setLayout(null);
JButton connect = new JButton("Connect");
panel.add(connect);
connect.setBounds(200, 200, 80, 40);
connect.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
readytoconnect = true;
}
});
Thread threadtoconnect = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("WAITING TO CONNECT");
if (readytoconnect) {
System.out.println("CONNECTED");
}
}
}
});
threadtoconnect.start();
}
}
这是不起作用的版本代码:
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main {
static boolean readytoconnect = false;
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
JPanel panel = new JPanel();
frame.add(panel);
panel.setBounds(0, 0, frame.getWidth(), frame.getHeight());
panel.setBackground(Color.lightGray);
panel.setLayout(null);
JButton connect = new JButton("Connect");
panel.add(connect);
connect.setBounds(200, 200, 80, 40);
connect.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
readytoconnect = true;
}
});
Thread threadtoconnect = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
//System.out.println("WAITING TO CONNECT");
if (readytoconnect) {
System.out.println("CONNECTED");
}
}
}
});
threadtoconnect.start();
}
}
它们之间的区别在于,第一个有效,在 'IF' 之前有输出,而第二个无效,没有输出。
【问题讨论】:
-
我猜你的线程崩溃了。检查您的 stderr 输出是否有异常。
-
你有一个非常短的循环,并且不能保证 threadtoconnect 会看到
readytoconnect的更新值。您可以使readytoconnect变得易变,但实际上您应该放弃执行等待循环的想法。你想做什么? -
在这种情况下,我在 Java 中使用 Swing 库,但我需要适用于 Android 的算法,因为无法在单击按钮事件中启动线程,我必须始终保持线程处于活动状态并准备执行在按钮侦听器中运行的代码
-
如果我在 volatile 工作中声明 readytoconnect 变量!!!我从来不知道volatile类型的存在,我想知道更多。
-
那么也许你应该提出一个关于保持“线程处于活动状态并准备好执行代码”的 android 问题。 Java 提供了多种等待条件的技术。在您的示例中,您正在创建一个新线程,因此它已经不符合您的条件。
标签: java multithreading swing serversocket