-1

いくつかのリクエストを実行して、さまざまなサーバーを実行し、プログラムの動作をデバッグしようとしています。最初に、いくつかのリクエストを行ういくつかの asynctasks を作成して実行します

public class MyTask extends AsyncTask<Object, Void, Void> {
    int runnnigDownloadThreadsCount = 0;

    @Override
    protected Void doInBackground(Object... params) {
        runnnigDownloadThreadsCount++;
        try {
            // TODO здесь необходимо исправить serverName на оригинальный урл с указанием параметра сервера
            List<TravelTicket> ticketsList = TravelTicket.downloadTickets((TravelTicket.RequestServerParams) params[0], (String) params[1]);
            if (ticketsList != null)
                synchronized (TravelBookingApplication.travelTicketsList) {
                    TravelBookingApplication.travelTicketsList.addAll(ticketsList);
                }
            return null;
        } catch (Exception e) {
            throw new Error(e);
        }
    }

    @Override
    protected void onPostExecute(Void result) {
        runnnigDownloadThreadsCount--;
        if (runnnigDownloadThreadsCount == 0) {
            Intent i = new Intent(getActivity().getApplicationContext(), HotelsAndTicketsResponseListActivity.class);
            i.putExtra("requestType", "tickets");
            getActivity().startActivity(i);
            if (dialog != null)
                dialog.dismiss();
        }
    }
}

    String[] urls = new String[]{
            "http://dl.dropbox.com/u/34053723/provider1.json"
            ,
            "http://dl.dropbox.com/u/34053723/provider2.json",
            "http://dl.dropbox.com/u/34053723/provider3.json",
            "http://dl.dropbox.com/u/34053723/provider4.json"
    };
    for (final String serverName : urls) {
        // TODO ЗАМЕНИТЬ!!!
        // for (final String serverName : params.serverNames) {
        new MyTask().execute(params, serverName);
    }

次の関数 TravelTicket.downloadTickets(...) で、RestTemplate を使用してデータをロードします

public static ArrayList<TravelTicket> downloadTickets(RequestServerParams requestServerParams, String serverName) throws Exception {
    // Запрос к серверу с указанием конретного провайдера и идентификторов запроса

    // Заголовки
    HttpHeaders requestHeaders = new HttpHeaders();

    requestHeaders.setUserAgent(TravelBookingApplication.USER_AGENT);

    HttpEntity requestEntity = new HttpEntity(requestHeaders);
    RestTemplate restTemplate = new RestTemplate();

各スレッドは最後の行に近づきHttpEntity requestEntity = new HttpEntity(requestHeaders);ますが、ここで最初に実行した後、デバッガーがフリーズします。ブレークポイントで停止しているように見えますが、誰もいません。

4

1 に答える 1

3

何が起こっているのかわかりませんが (十分な情報がありません)、RestTemplateスレッドセーフであり、一度設定してスレッド間で共有するように設計されていることは確かです。これはすべてのスプリング*Templateオブジェクトと一致しています。

このステートメントは、いくつかの場所で、Spring 4.0 ドキュメントによってサポートされています。

セクション11.6.1 TransactionTemplateの使用

TransactionTemplate は、JdbcTemplate などの他の Spring テンプレートと同じアプローチを採用しています。... 最後に、TransactionTemplate クラスのインスタンスはスレッドセーフです

セクション 13.2.1 JdbcTemplate のベストプラクティス

JdbcTemplate クラスのインスタンスは、一度構成するとスレッドセーフになります。

粘り強さがあれば、 についての同様のステートメントを見つけることができますJmsTemplate。ドキュメントに関してはRestTemplate単に次のように述べています。

...これは、JdbcTemplate や JmsTemplate などの Spring の他のテンプレート クラスや、他の Spring ポートフォリオ プロジェクトにある他のテンプレート クラスと概念的に似ています。

このことから、他のコア テンプレート クラスと同じようにスレッド セーフを意図していると推測しました。これはもちろん、スレッドセーフであることが保証されていないことを意味します。そうでない場合、それはバグです。

于 2012-07-05T14:49:44.800 に答える