Java 如何在线程安全的多swing worker线程中使用实例变量?
我正在使用swing worker线程与rest服务通信。我的场景是我调用一个线程从rest服务获取数据并添加到我的列表变量中。 另一个线程用于推送数据列表以保存它。如何使用线程安全机制处理此场景 下面是我的示例代码Java 如何在线程安全的多swing worker线程中使用实例变量?,java,multithreading,swing,swingworker,Java,Multithreading,Swing,Swingworker,我正在使用swing worker线程与rest服务通信。我的场景是我调用一个线程从rest服务获取数据并添加到我的列表变量中。 另一个线程用于推送数据列表以保存它。如何使用线程安全机制处理此场景 下面是我的示例代码 private LinkedList<LinkInfo> ***linkInfoList*** = new LinkedList<FlowLinkEntry>(); SwingWorker<LinkInfo, Void> loadLink
private LinkedList<LinkInfo> ***linkInfoList*** = new LinkedList<FlowLinkEntry>();
SwingWorker<LinkInfo, Void> loadLinkInfoThread = new SwingWorker<LinkInfo, Void>() {
@Override
protected LinkInfo doInBackground() throws Exception {
InputStream is = new URL("Http://URL").openStream();
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(is,
Charset.forName("UTF-8")));
LinkInfo linkInfo = (LinkInfo)JsonConverter
.fromJson(reader, LinkInfo.class);
***linkInfoList*** .add(linkInfo);
} finally {
is .close();
}
return linkInfo;
}
}
SwingWorker<Void, Void> saveLinkInfoThread = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
//post data to particular url
//linkInfoList data is posting in this thread
URL url = new URL(http://url);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(***linkInfoList*** );
wr.flush();
// Get the response
BufferedReader rd = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
}
private LinkedList***linkInfoList***=new LinkedList();
SwingWorker loadLinkInfoThread=新SwingWorker(){
@凌驾
受保护的LinkInfo doInBackground()引发异常{
InputStream is=新URL(“Http://URL)。openStream();
试一试{
BufferedReader reader=新的BufferedReader(
新的InputStreamReader(is,
字符集forName(“UTF-8”);
LinkInfo LinkInfo=(LinkInfo)JsonConverter
.fromJson(reader,LinkInfo.class);
***链接信息列表***.添加(链接信息);
}最后{
is.close();
}
返回链接信息;
}
}
SwingWorker saveLinkInfoThread=新SwingWorker(){
@凌驾
受保护的Void doInBackground()引发异常{
//将数据发布到特定url
//linkInfoList数据正在该线程中发布
URL=新URL(http://url);
URLConnection conn=url.openConnection();
连接设置输出(真);
OutputStreamWriter wr=新的OutputStreamWriter(conn.getOutputStream());
wr.write(***链接信息列表***);
wr.flush();
//得到回应
BufferedReader rd=新的BufferedReader(新的InputStreamReader(
conn.getInputStream());
}
}
我的问题是
我会在初始化时同步列表 然后,如果有任何项目要保存,则必须测试列表,否则请等待
SwingWorker<Void, Void> saveLinkInfoThread = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
List info = new ArrayList();
while (***linkInfoList***.isEmpty()){
Thread.currentThread().sleep(1000);
}
while (!***linkInfoList***.isEmpty()){
info.add(***linkInfoList***.remove(0));
}
//post data to particular url
//linkInfoList data is posting in this thread
URL url = new URL(http://url);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(info);
wr.flush();
// Get the response
BufferedReader rd = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
}
SwingWorker saveLinkInfoThread=new SwingWorker(){
@凌驾
受保护的Void doInBackground()引发异常{
列表信息=新的ArrayList();
而(***linkInfoList***.isEmpty()){
Thread.currentThread().sleep(1000);
}
而(!***linkInfoList***.isEmpty()){
信息添加(***链接信息列表***.删除(0));
}
//将数据发布到特定url
//linkInfoList数据正在该线程中发布
URL=新URL(http://url);
URLConnection conn=url.openConnection();
连接设置输出(真);
OutputStreamWriter wr=新的OutputStreamWriter(conn.getOutputStream());
wr.write(信息);
wr.flush();
//得到回应
BufferedReader rd=新的BufferedReader(新的InputStreamReader(
conn.getInputStream());
}
可能使用同步块?尝试使用CopyOnWriteArrayList()Hi如果我当时调用两个线程,我想在完成加载线程后运行此保存线程。使用同步块时是否可能?所有星号都有什么问题?
SwingWorker<Void, Void> saveLinkInfoThread = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
List info = new ArrayList();
while (***linkInfoList***.isEmpty()){
Thread.currentThread().sleep(1000);
}
while (!***linkInfoList***.isEmpty()){
info.add(***linkInfoList***.remove(0));
}
//post data to particular url
//linkInfoList data is posting in this thread
URL url = new URL(http://url);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(info);
wr.flush();
// Get the response
BufferedReader rd = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
}