Как использовать переменную экземпляра в нескольких рабочих потоках Swing с потокобезопасностью?

Я использую рабочий поток 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. Как перевести поток сохранения в состояние ожидания, если поток загрузки уже выполняется. Я имею в виду, что если поток загрузки находится в рабочем состоянии, после завершения потока загрузки должен запускаться только поток сохранения.


person Murali    schedule 29.10.2013    source источник
comment
Возможно, использовать синхронизированный блок?   -  person Marko Topolnik    schedule 29.10.2013
comment
Попробуйте использовать CopyOnWriteArrayList (docs.oracle.com /javase/6/docs/api/java/util/concurrent/)   -  person alex2410    schedule 29.10.2013
comment
Привет, если я вызову оба потока в это время, я хочу запустить этот поток сохранения после завершения потока загрузки. Возможно ли это, когда я использую синхронизированный?.   -  person Murali    schedule 29.10.2013
comment
Что случилось со всеми звездочками?   -  person Zoltán    schedule 29.10.2013


Ответы (1)