Hi,
ist im Prinzip nur eine Verständnissfrage: Ich habe eine interne Speicherprozedur die sich, mit Hilfe von Quartz, zeitgesteuert jeden Tag um 0 Uhr über eine Funktion eine Kopie (Deep Copy per Serialisierung) der aktuellen Daten holt und diese in eine XML Datei abspeichert. Muss ich in der Zeit der Serialisierung, also des Kopiervorganges, Schreib und Lesevorgänge durch andere Threads verhindern (es geht in dem Fall speziell um Listen) oder wäre das unproblematisch?
MfG RBS2002
Habe mal ein kleines Programm programmiert mit dem ich das ganze nachvollziehen konnte. Als der Thread in die Liste geschrieben hat kam immer ein Nullpointer raus, erst als nichts geschrieben wurde hat er die Meldung "Erfolgreich" abgegeben. Vielleicht kennt jemand dafür eine Lösung, deswegen das Programm das ich schnell geschrieben habe:
Copy Konstruktor:
Frame:
"Datenobjekt"
Der Schreib-Thread
ist im Prinzip nur eine Verständnissfrage: Ich habe eine interne Speicherprozedur die sich, mit Hilfe von Quartz, zeitgesteuert jeden Tag um 0 Uhr über eine Funktion eine Kopie (Deep Copy per Serialisierung) der aktuellen Daten holt und diese in eine XML Datei abspeichert. Muss ich in der Zeit der Serialisierung, also des Kopiervorganges, Schreib und Lesevorgänge durch andere Threads verhindern (es geht in dem Fall speziell um Listen) oder wäre das unproblematisch?
MfG RBS2002
Habe mal ein kleines Programm programmiert mit dem ich das ganze nachvollziehen konnte. Als der Thread in die Liste geschrieben hat kam immer ein Nullpointer raus, erst als nichts geschrieben wurde hat er die Meldung "Erfolgreich" abgegeben. Vielleicht kennt jemand dafür eine Lösung, deswegen das Programm das ich schnell geschrieben habe:
Copy Konstruktor:
Java:
public class Copy {
public static Object clone(Object copyObject) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(copyObject);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
Object deepCopy = ois.readObject();
return deepCopy;
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
Frame:
Java:
public class Frame extends JFrame{
private Data daten;
private JTextArea text;
private JButton hole_kopie;
private JButton beende_schreiben;
private Fuellen fill;
public Frame() {
this.setLayout(new BorderLayout());
this.add(beende_schreiben = new JButton("Beende schreiben"),BorderLayout.NORTH);
this.add(new JScrollPane(text = new JTextArea()),BorderLayout.CENTER);
this.add(hole_kopie = new JButton("Hole Daten"),BorderLayout.SOUTH);
daten = new Data();
beende_schreiben.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
fill.stop();
}
});
hole_kopie.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try{
ArrayList clone = (ArrayList) Copy.clone(daten.getListe());
if(clone!=null){
text.append("Kopieren erfolgreich");
}
}catch(Exception ex){
text.append(ex.getMessage()+"\n");
}
}
});
fill = new Fuellen(daten);
fill.start();
this.setSize(500,500);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
}
"Datenobjekt"
Java:
public class Data {
private ArrayList liste;
public Data() {
liste = new ArrayList();
}
public ArrayList getListe() {
return liste;
}
}
Der Schreib-Thread
Java:
public class Fuellen implements Runnable{
private Data data;
private Thread t;
public void start(){
t = new Thread(this);
t.start();
}
public void stop(){
if(t!=null){
t = null;
}
}
public Fuellen(Data data) {
this.data = data;
}
public void run() {
while(t != null){
data.getListe().add("Schreibe einfach nur");
System.out.println("Schreibe");
}
}
}
Zuletzt bearbeitet: