Java异步编程FutureTask原理与使用

版权申诉
0 下载量 9 浏览量 更新于2024-07-02 收藏 152KB DOCX 举报
揭密FutureTask 在 Java 中,Future 是一个接口,它定义了五个方法,分别是 cancel、isCancelled、isDone、get、get(long timeout, TimeUnit unit)。这些方法都是异步编程的核心部分,用于处理线程池提交的任务。 首先,let's talk about cancel 方法。该方法用于取消一个任务,并返回取消结果。参数 mayInterruptIfRunning 表示是否中断线程。如果参数为 true,则线程将被中断;否则,线程不会被中断。 其次,isCancelled 方法用于判断任务是否被取消。如果任务被取消,则返回 true;否则,返回 false。 再者,isDone 方法用于判断当前任务是否执行完毕,包括正常执行完毕、执行异常或者任务取消。如果任务已经执行完毕,则返回 true;否则,返回 false。 get 方法用于获取任务执行结果。任务结束之前会阻塞。如果任务执行完毕,则返回执行结果;否则,抛出 InterruptedException 或 ExecutionException。 最后,get(long timeout, TimeUnit unit) 方法用于在指定时间内尝试获取执行结果。如果在指定时间内获取不到执行结果,则抛出 TimeoutException。 下面是一个简单的 Demo: public class FutureDemo { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); Future<Object> future = executorService.submit(new Callable<Object>() { @Override public Object call() throws Exception { Long start = System.currentTimeMillis(); while (true) { Long current = System.currentTimeMillis(); if ((current - start) > 1000) { return 1; } } } }); } } 在这个 Demo 中,我们首先创建了一个线程池,然后提交了一个 Callable 任务。该任务会在执行 1 秒后返回结果。在 main 方法中,我们可以使用 Future 的 get 方法来获取执行结果。 FutureTask 是 Java 中一个非常重要的类,它实现了 Runnable 和 Future 接口。它可以用来处理线程池提交的任务,并提供了异步编程的支持。在 Java 1.7 中,FutureTask 是 JUC(Java Util Concurrency)包的一部分,提供了高效的并发编程支持。 Future 是 Java 异步编程的核心部分,它提供了五个方法来处理线程池提交的任务。开发者可以使用这些方法来编写高效、可靠的异步程序。

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 Process: com.ncusoft.weatherchina, PID: 32468 java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$4.done(AsyncTask.java:415) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:381) at java.util.concurrent.FutureTask.setException(FutureTask.java:250) at java.util.concurrent.FutureTask.run(FutureTask.java:269) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637) at java.lang.Thread.run(Thread.java:1012) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:121) at org.json.JSONTokener.nextValue(JSONTokener.java:98) at org.json.JSONObject.<init>(JSONObject.java:168) at org.json.JSONObject.<init>(JSONObject.java:185) at com.ncusoft.weatherchina.RemoteDataParser.parseJsonToWeather(RemoteDataParser.java:52) at com.ncusoft.weatherchina.RemoteDataParser.parseWeatherData(RemoteDataParser.java:20) at com.ncusoft.weatherchina.MainActivity$weatherTask.doInBackground(MainActivity.java:48) at com.ncusoft.weatherchina.MainActivity$weatherTask.doInBackground(MainActivity.java:36) at android.os.AsyncTask$3.call(AsyncTask.java:394) at java.util.concurrent.FutureTask.run(FutureTask.java:264) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)  at java.lang.Thread.run(Thread.java:1012)  W/ft.weatherchina: Cleared Reference was only reachable from finalizer (only reported once) W/System: A resource failed to call close.

2023-05-17 上传
2023-05-22 上传