gpt4 book ai didi

java - JAXB 和同步

转载 作者:行者123 更新时间:2023-11-30 04:22:26 26 4
gpt4 key购买 nike

我有一个这样的类(class):

import java.util.Vector;
import javax.xml.bind.annotation.*;

@XmlRootElement(name="task-list")
@XmlAccessorType(XmlAccessType.FIELD)
public class TaskList {
@XmlElement(name="task")
Vector<Task> tasks;

public Vector<Task> getTasks(){
return tasks;
}
}

GUI 中的线程操作 Vector<Task>包含在其中,因此操作是 synchronized(vectorname){....}以避免冲突和不一致。

现在,我想将其编码到 XML 文件。如果我获得 TaskList 的锁定保存(编码)对象时,是否会导致 Vector 上的锁定之内 ?

基本上,当用户按下保存按钮时,线程可以操作 vector 。我不希望发生错误并因此出现同步块(synchronized block)。

此外,我想避免两个线程同时请求相同资源时可能发生的死锁。我怎样才能避免这种情况?设置优先级是一个好的选择吗?

任务.java

package jaxb.classes;

import javax.xml.bind.annotation.*;
import java.util.Vector;
import java.io.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Task {
@XmlElement(name="input")
private String input; // String representing the input file
@XmlElement(name="output")
private String output; // String representing the output file
@XmlElement(name="format")
private Format format; // a jaxb.classes.Format representing the format of conversion
@XmlElement(name="taskID")
private long taskID; // a unique ID for each task.
@XmlElement(name="isReady")
public boolean isReady; // boolean value representing whether the task is ready for conversion

@XmlTransient
public boolean isChanging = false; // boolean representing if the user is changing the task DO NOT MARSHALL
@XmlTransient
public boolean isExecuting = false; // boolean representing whether the task is being executed DO NOT MARSHALL

public long getTaskID(){
return taskID;
}

public String getInput(){
return input;
}

public String getOutput(){
return output;
}

public Format getFormat(){
return format;
}

public void setOutput(String out){
output = out;
}

public void setFormat(Format f){
format = f;
}

/*
* This method will be used to create a vector
* which will be used to add row representation
* of the ask.
*/
public Vector<Object> getRowForm(){
Vector<Object> rowForm = new Vector<Object>();
rowForm.add(input);
rowForm.add(output);
rowForm.add(format.toString());

File f = new File(input);
double d = (double) (f.length()/(1024*1024));
String fileSize = String.format("%7.2f MB",d);
rowForm.add(fileSize);

return rowForm;
}

/*
* This is the only constructor that will be called
* when the user drops new file(s).
* This will be called in the AddNewTaskWindow class.
* {@param i} is a String representing input file
* {@param o} is a String representing output location
* {@param f} is a jaxb.classes.Format representing the format to convert to
* {@param taskID} is a unique ID for the task.
*/
public Task(String i, String o,Format f, long taskID){
input = i;
output = o;
format = f;
this.taskID = taskID;
}

}

最佳答案

如您所知,Vector 类中的方法是同步的,因此对 vector 实例的任何访问都是安全的。但是 vector 中的任务实例是线程安全的吗?否则,您将无法按照您的描述保护它们免受并发访问。我的建议是不要使用这种阻塞方法,并避免使用共享任务列表来执行此操作,使用异步事件驱动方法。因为在 GUI 线程和 JAXB 操作中更新这些任务是程序的两种不同操作/行为。当您需要保存(或任何其他非 UI 相关工作)时,您可以使用执行器事件总线操作 GUI 相关线程中的任务和触发事件。然后你可以有另一个线程来执行JAXB操作,另一个优点是你可以在完成保存后获取回调事件,你可以从UI线程监听这些事件。因此,您不必担心任何共享资源的维护或它们的同步,并且易于维护。

关于java - JAXB 和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16714556/

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