线程执行器在循环

时间:2016-05-16 13:39:53

标签: android multithreading executorservice java.util.concurrent threadpoolexecutor

我正在尝试使用我使用的ThreadExecutor的IntentService实现多个并发文件上传。我正在遍历地图并逐个迭代,我正在获取信息并实例化一个workerthread。在循环内部,我有执行程序正在执行这些线程。以下是我的代码。

@Override
protected void onHandleIntent(Intent intent) {

    Debug.print("Called handleIntent");
    mFileMap = (HashMap<String, Integer>) intent.getSerializableExtra("pdf_info");
    mMapSize = mFileMap.size();
    Log.e("pdf", mFileMap.toString());

    mExecutor = Executors.newFixedThreadPool(2);

    mTotalFileSize = getTotalFileSize();
    Log.e("total_file_size", mTotalFileSize + "");

    ArrayList<UploadWorker> uploadWorkerArrayList = new ArrayList<>();

    Iterator it = mFileMap.entrySet().iterator();


    for(Map.Entry<String, Integer> entry : mFileMap.entrySet())
    {
        String filePath = (String) entry.getKey();
        Log.e("map_path: ", filePath);
        int categoryId = (int) entry.getValue();
        Log.e("map_no: ", categoryId + "");
        // uploadWorkerArrayList.add(new UploadWorker(filePath, categoryId));
        UploadWorker worker = new UploadWorker(filePath, categoryId);
        mExecutor.submit(worker);
    }

    mExecutor.shutdown();

    Log.e("workerlist: ", uploadWorkerArrayList.toString());


}

以下是我的UploadWorker代码。

class UploadWorker implements Runnable {

    String filePath;
    int categoryId;

    public UploadWorker(String filePath, int categoryId) {
        this.filePath = filePath;
        this.categoryId = categoryId;
    }


    @Override
    public synchronized void run() {
        mFile = new File(filePath);
        Log.e("uploadworker", filePath);
        mParams = new LinkedHashMap<>();


        mParams.put("file_type", 2 + "");
        mParams.put("file_name", mFile.getName());
        mParams.put("category_id", categoryId + "");

        notificationId++;
        mNotificationMap.put(filePath, notificationId);
        createNotification(notificationId, mFile.getName());
        int response = uploadPDF(filePath);

        if (response == 1) {
            JSONObject jObject = null;
            String status = null;
            try {
                jObject = new JSONObject(mServerResponse);
                status = jObject.getString("status");
                int id = mNotificationMap.get(filePath);
                updateNotification(100, id);
            } catch (JSONException e) {
                e.printStackTrace();
            }


            Log.e("<><>", status);
        } else {
            Log.e("<><>", "Upload fail");
        }
    }
}

然而,如果说我的maplist有2个条目,那么迭代器首先获取两个条目,而执行器只上传最后的条目,这也是两次。请帮忙。

0 个答案:

没有答案