Java 如何在线程安全的多swing worker线程中使用实例变量?

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

我正在使用swing worker线程与rest服务通信。我的场景是我调用一个线程从rest服务获取数据并添加到我的列表变量中。 另一个线程用于推送数据列表以保存它。如何使用线程安全机制处理此场景

下面是我的示例代码

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

我的问题是

  • 如何将数据按请求顺序存储在linkInfoList中? (即)如果我多次调用load thread,则数据应插入list request wise中

  • 如果加载线程为,如何将保存线程的等待状态设置为 已经在进行中。我的意思是,如果加载线程在 运行条件,在完成加载线程之后,只有保存线程必须运行


  • 我会在初始化时同步列表

    然后,如果有任何项目要保存,则必须测试列表,否则请等待

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