gpt4 book ai didi

java - 在多线程中运行的类内变量的范围存在问题

转载 作者:行者123 更新时间:2023-12-01 15:25:30 25 4
gpt4 key购买 nike

我有这样的东西:



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 创建为静态时,它可以工作,但由于我将此类放入线程中,因此所有 map 都将指向同一个 map ,从而使比较毫无用处。具体来说,我看到在函数accept 中,映射有0 个值。

函数accept是SteamFilter接口(interface)的一部分,因此当事件发生时会自动调用它。我尝试过将 map 更改为公共(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中map的值吗?

最佳答案

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

更改:

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

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

关于java - 在多线程中运行的类内变量的范围存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10218321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com