package cn.androidy.thinking.concurrent; import android.os.Handler; import android.os.Looper; import android.os.Message; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; /** * Created by Rick Meng on 2015/6/16. */ public class ThreadJob implements ThreadJobCallback { private final ExecutorService executorService; private PrioritizedRunnable runnable; private volatile Future<?> future; private static final Handler MAIN_THREAD_HANDLER = new Handler(Looper.getMainLooper(), new MainThreadCallback()); private static final int MSG_COMPLETE = 1; private static final int MSG_EXCEPTION = 2; private ThreadResultConsumer consumer; private boolean isCancelled; public ThreadJob(ExecutorService es) { executorService = es; } public ThreadJob(ExecutorService es, ThreadResultConsumer consumer) { executorService = es; this.consumer = consumer; } public String printRunnableInfo() { return runnable.getName() + " priority:" + runnable.getPriority(); } public static int getAvailableProcessors() { return Runtime.getRuntime().availableProcessors(); } public void start(PrioritizedRunnable runnable) { this.runnable = runnable; future = executorService.submit(runnable); } @Override public void onJobComplete() { MAIN_THREAD_HANDLER.obtainMessage(MSG_COMPLETE, this).sendToTarget(); } private static class MainThreadCallback implements Handler.Callback { @Override public boolean handleMessage(Message message) { if (MSG_COMPLETE == message.what || MSG_EXCEPTION == message.what) { ThreadJob job = (ThreadJob) message.obj; if (MSG_COMPLETE == message.what) { job.handleResultOnMainThread(); } else { job.handleExceptionOnMainThread(); } return true; } return false; } } private void handleResultOnMainThread() { consumer.onJobComplete(this); } private void handleExceptionOnMainThread() { } public void cancel() { runnable.cancel(); consumer.onJobCanceled(this); Future currentFuture = future; if (currentFuture != null) { currentFuture.cancel(true); } isCancelled = true; } }