ThreadPoolExecutor: получить конкретный Runnable, который выполняется.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 ThreadPoolExecutor: получить конкретный Runnable, который выполняется.

Сообщение Anonymous »

Я использую ThreadPoolExecutor для выполнения нескольких длительных задач в фоновом режиме, размер пула ThreadPoolExecutor равен 4, поэтому при добавлении более 4 задач они помещаются в очередь, а когда одна из 4 задачи завершаются, одна задача извлекается из очереди для выполнения.

Я хочу знать, есть ли способ получить доступ к объекту Runnable, который в данный момент выполняется, и не в очереди, то есть первые 4 задачи.

Цель: я хочу сделать это, чтобы получить текущий статус задачи в любой заданный момент с помощью mThreadPoolExecutor.getQueue() Я получаю доступ к задачам, поставленным в очередь и готовым к выполнению. Предложите мне способ доступа к задачам, которые в данный момент выполняются, чтобы я мог при необходимости прикреплять к ним и удалять прослушиватель/обработчик.

Мой исполняемый файл класс:

public class VideoFileUploadRunner implements Runnable {

private final VideoFileSync mVideoFileSync;
private final DataService dataService;

private Handler handler;

public VideoFileUploadRunner(VideoFileSync videoFileSync, DataService dataService) {
this.mVideoFileSync = videoFileSync;
this.dataService = dataService;

}

public int getPK()
{
return mVideoFileSync.get_idPrimaryKey();
}

public void setHandler(Handler handler) {
this.handler = handler;
}

@Override
public void run() {
try {

if (mVideoFileSync.get_idPrimaryKey() < 0) {
addEntryToDataBase();
}
updateStatus(VideoUploadStatus.IN_PROGRESS);
FileUploader uploader = new FileUploader();
updateStatus(uploader.uploadFile(mVideoFileSync.getVideoFile()));

} catch (Exception e) {
updateStatus(VideoUploadStatus.FAILED);
e.printStackTrace();
}
}

private void addEntryToDataBase() {
int pk = dataService.saveVideoRecordForSync(mVideoFileSync);
mVideoFileSync.set_idPrimaryKey(pk);
}

private void updateStatus(VideoUploadStatus status) {
if (handler != null) {
Message msg = new Message();
Bundle b = new Bundle();
b.putString(AppConstants.Sync_Status, status.toString());
msg.setData(b);
handler.sendMessage(msg);
}
dataService.updateUploadStatus(mVideoFileSync.get_idPrimaryKey(), status.toString());

}
}


В держателе представления списка выполнения задач:

public void setData(VideoFileSync fileSync) {
tvIso.setText(fileSync.getVideoFile().getISO_LOOP_EQUP());
tvUnit.setText(fileSync.getVideoFile().getUnit());
tvName.setText(fileSync.getVideoFile().getLocalPath());
tvStatus.setText(fileSync.getCurentStatus().toString());
addHandleForUpdate(fileSync);
}

private void addHandleForUpdate(VideoFileSync fileSync) {

Handler.Callback callBack = new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.getData()!=null)
{
tvStatus.setText(msg.getData().getString(AppConstants.Sync_Status));

}
return false;
}
};
mHadler = new Handler(Looper.getMainLooper(),callBack);

VideoFileUploadRunner runner = VideoUploadManager.getInstance().getRunnerForSyncFile(fileSync);
if(runner!=null)
runner.setHandler(mHadler);
}


в VideoUploadManager у меня есть следующий метод для возврата объекта Runnable. Здесь мне нужна помощь, чтобы я мог возвращать выполняемые в данный момент задачи.

public synchronized VideoFileUploadRunner getRunnerForSyncFile(VideoFileSync fileSync) {
Iterator itr = mThreadPoolExecutor.getQueue().iterator();
while (itr.hasNext()) {
VideoFileUploadRunner runner = (VideoFileUploadRunner) itr.next();
if (runner.getPK() == fileSync.get_idPrimaryKey()) {
return runner;
}
}
return null;

}


Подробнее здесь: https://stackoverflow.com/questions/420 ... g-executed
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»