线程中的Java变量

线程中的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

我在这里读了一些问题/答案,但对于java线程和变量是如何工作的,我还是有点困惑

我的软件为一些事件打开了一个连续的URL侦听器,这些事件连接了RESTAPI的某个升级版本,但我要离题了。下面是一段总结的代码

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),还是需要将变量传递给每个子线程


  • 如果parseXML中声明的公共变量对newAlarm的所有子线程都可用,那么如果主脚本再次触发newAlarm,会发生什么情况?公共parseXML变量是否与另一个线程中的变量冲突

  • 这个警报是这样的。保留代码中不相关的部分。请注意,还没有设置线程

    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(…)
    例程的线程,如果你的代码告诉它这样做的话,这个线程可以释放其他线程。