线程中的Java变量
我在这里读了一些问题/答案,但对于java线程和变量是如何工作的,我还是有点困惑 我的软件为一些事件打开了一个连续的URL侦听器,这些事件连接了RESTAPI的某个升级版本,但我要离题了。下面是一段总结的代码线程中的Java变量,java,multithreading,Java,Multithreading,我在这里读了一些问题/答案,但对于java线程和变量是如何工作的,我还是有点困惑 我的软件为一些事件打开了一个连续的URL侦听器,这些事件连接了RESTAPI的某个升级版本,但我要离题了。下面是一段总结的代码 public static void main(String[] args) { //open the long-running URL conn = (HttpURLConnection) url.openConnection(); // Start to re
public static void main(String[] args) {
//open the long-running URL
conn = (HttpURLConnection) url.openConnection();
// Start to receive the event notification.
br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
// Read a complete event. Process the event.
String str = sb.toString();
sb.delete(0, sb.length());
// Parse the alarm and send to the sub-processor if necessary
log4j.debug("Start Event Parsing");
ParseAlarm.parseXML(str);
Thread newAlarm = new Thread(new CreateAlarm());
newAlarm.start();
}
请注意,如果在解析完成之前收到第二个事件,其中一个会丢失,那么这就是修复错误的全部方法
ParseAlarm.parseXML(str)
移动到newAlarm线程(它触发额外的线程以维持顺序)中,那么所有的子线程都可以访问parseXML中声明的公共变量(一些是数组,一些是int/string),还是需要将变量传递给每个子线程public class ParseAlarm {
public static int intAlarmID;
public static String strAlarmDesc;
public static Map<String, String> mXML = new HashMap<String, String>();
public static void ParseXML(String strXML) throws Exception {
for (int i = 0; i < arElementList.length; i++) {
//parse the elements in the XML
}
// Create the alarm ID as an integer for the alarm acknowledgement and the alarm description for the filter
intAlarmID = Integer.parseInt(mXML.get("id"));
strAlarmDesc = mXML.get("alarmDesc");
}
}
公共类解析报警{
公共静态int-intAlarmID;
公共静态字符串strAlarmDesc;
公共静态映射mXML=newhashmap();
公共静态void ParseXML(字符串strXML)引发异常{
for(int i=0;i
我已经能够通过引用其他线程访问声明为公共的变量,例如:
公共静态映射mAlarm=ParseAlarm.mXML;
private int intID=ParseAlarm.intAlarmID
这是不应该发生的还是我完全做错了?您永远不能从方法外部访问方法(
ParseXML()
)中声明的变量。ParseAlarm
是实例还是ParseAlarm.ParseXML()
是静态方法。很难说,因为您没有遵循命名约定(camelCase)。而且CreateAlarm
对于类来说似乎是一个不寻常的名称。“用parseXML声明的公共变量”。由于parseXML()
是一个方法,因此不能在其中声明公共变量。仅本地变量,这些变量不被任何其他线程看到,并且仅在方法期间存在。线程不包含变量,不包含对象,也不包含其他线程。线程基本上是执行代码的恶魔。你的程序总是从一个线程开始——执行main(…)
例程的线程,如果你的代码告诉它这样做,该线程可以释放其他线程。你永远不能从方法外部访问方法(ParseXML()
)中声明的变量。ParseAlarm
是实例吗,或者ParseAlarm.ParseXML()
是静态方法。很难说,因为您没有遵循命名约定(camelCase)。而且CreateAlarm
对于类来说似乎是一个不寻常的名称。“用parseXML声明的公共变量”。由于parseXML()
是一个方法,因此不能在其中声明公共变量。仅本地变量,这些变量不被任何其他线程看到,并且仅在方法期间存在。线程不包含变量,不包含对象,也不包含其他线程。线程基本上是执行代码的恶魔。你的程序总是从一个线程开始——执行main(…)
例程的线程,如果你的代码告诉它这样做的话,这个线程可以释放其他线程。