gpt4 book ai didi

java - 如何在线程安全的多个 Swing 工作线程中使用实例变量?

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

我正在使用 Swing 工作线程来通信休息服务。我的场景是我正在调用一个线程来从其余服务获取数据并将其添加到我的列表变量中。另一个线程推送数据列表以保存它。如何以线程安全的方式处理这种场景

我的示例代码如下

  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()));

}

}

我的问题是

  1. 如何按照请求顺序将数据存储在 linkInfoList 中?(即)如果我多次调用加载线程,数据应该明智地插入列表请求中。

  2. 如果加载线程是,如何将保存线程置于等待状态 已经在进行中。我的意思是如果加载线程位于 运行条件,完成加载线程后,只有保存线程应该运行

最佳答案

我会在初始化时将列表同步为 Oracle says .

List ***linkInfoList*** = Collections.synchronizedList(new LinkedList(...));

然后您必须测试列表中是否有任何项目要保存,否则请等待。

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()));

}

关于java - 如何在线程安全的多个 Swing 工作线程中使用实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19652282/

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