麻烦要在多线程中运行的类中的变量范围

时间:2012-04-18 21:29:49

标签: java

我有这样的事情:



    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.HashMap;
    import java.util.Map;
    import javax.xml.stream.*;
    import javax.xml.stream.events.*;

    public class MyClass implements javax.xml.stream.StreamFilter
    {
        private Map myMap= new HashMap();

        public Map getMap()
        {
            return this.myMap;
        }

        public void addElement(String text)
        {
            this.myMap.put(text, "value");
        }

        public void doSomething(String strValue)
        {

            try
            {
                XMLInputFactory xmlif = null;
                xmlif = XMLInputFactory.newInstance();          
                FileInputStream fis = new FileInputStream("myFile.xml");
                XMLStreamReader xmlr = xmlif.createFilteredReader(xmlif.createXMLStreamReader(fis),new MyClass());

                XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
                OutputStream fileStream = new FileOutputStream("myFileOutput");
                XMLStreamWriter xmlWriter = outputFactory.createXMLStreamWriter(fileStream);

                addElement(strValue);
                System.out.println(getMap().size()+"Before");
                while (xmlr.hasNext())
                {
                    write(xmlr, xmlWriter);
                    xmlr.next();
                }
                System.out.println(getMap().size()+"After");
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }

        }

        public boolean accept(XMLStreamReader reader)
        {
            System.out.println(getMap().size()+"inside");
            if ( getMap().containsKey("Something") )
            {
                System.out.println("The value is there");
            }
            return true;
        }

        private void write(XMLStreamReader xmlr, XMLStreamWriter writer) throws XMLStreamException
        {
            switch (xmlr.getEventType()) {
                case XMLEvent.START_ELEMENT:
                    String localName = xmlr.getLocalName();
                    writer.writeStartElement(localName);
                break;
            }
        }   
    }


当我将 tagMap 创建为静态时,它可以正常工作,但由于我将这个类放在线程中,所以所有的地图都会指向同一个地图,这使得比较毫无用处。具体来说,我已经看到在函数accept中,地图有0个值。

函数accept是SteamFilter接口的一部分,因此在事件发生时会自动调用它。我已经尝试将地图更改为public,甚至用构造函数设置值,但它是相同的。

在创建类的类中调用它的方式是:



    Runnable runClass = new Runnable(){
        public void run(){
            try
            {
                MyClass myC = new MyClass();
                myC.doSomething("value");
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    Thread myTask = new Thread(runClass);
    myTask.start();


您知道如何在函数accept中检查地图的值吗?

2 个答案:

答案 0 :(得分:1)

您使用新的MyClass实例(尚未调用doSomething的实例)实现您的FilterReader。如果您使用当前正在处理的相同实例启动它,它应该可以工作。

变化:

xmlif.createFilteredReader(xmlif.createXMLStreamReader(fis),new MyClass())

xmlif.createFilteredReader(xmlif.createXMLStreamReader(fis),this)

答案 1 :(得分:0)

  1. 我假设每个线程都引用了MyMap的实例(可能是相同的实例)。

  2. 他们应该能够在引用上调用getMap()。

  3. 问:我错过了什么吗?