Future是Kotlin中的一种特殊类型,它类似于Android中的Handler,用于表示稍后要执行的任务。使用Future时,可以使用then方法来处理任务完成后的结果,或者使用catchError方法来捕获任务执行过程中的异常。
下面是一个简单的示例:
```kotlin
import kotlin.concurrent.*
fun main() {
val future = Future(() {
println("future do..")
return "1"
})
future.then { result ->
println(result)
}.whenComplete {
println("main end")
}
}
```
在这个示例中,我们首先创建了一个包含一个简单任务的Future。然后,我们使用then方法来处理任务完成后的结果,并在控制台上打印结果。最后,我们使用whenComplete方法来确保在主线程结束之前执行一些操作。
当我们运行这个程序时,输出如下:
```
main start
future do..
1
main end
```
可以看到,main end先打印,然后打印future里面的任务,最后then打印结果。
对于异常处理,Future提供了两个方法:catchError和onError。catchError方法接受一个函数作为参数,该函数将在任务发生异常时被调用。onError方法接受一个函数作为参数,该函数将在任务发生异常时被调用,但不会立即返回结果给调用者。如果不提供任何异常处理方法,那么当任务发生异常时,then方法将不会被调用,但是whenComplete方法最终也会被调用,类似于Java里面的finally。
下面是一个包含异常处理的示例代码:
```kotlin
import kotlin.concurrent.*
fun main() {
val future = Future(() {
throw Exception("this is error")
})
future.catchError { error ->
println("Caught exception: $error")
}.whenComplete {
println("done")
}
}
```
在这个示例中,我们创建了一个包含一个抛出异常的任务的Future。然后,我们使用catchError方法来捕获任务执行过程中的异常,并在控制台上打印异常信息。最后,我们使用whenComplete方法来确保在主线程结束之前执行一些操作。
以下是重构后的代码:
```java
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class Main {
public static void main(String[] args) throws InterruptedException, ExecutionException {
CompletableFuture
try {
throw new Exception("this is error");
} catch (Exception e) {
throw new FileSystemException("FileSystemException", e);
}
}).thenApply(v -> null).exceptionally(e -> {
System.out.println("catch Error: " + e.getMessage());
return null;
}).whenComplete((v, e) -> System.out.println("done"));
System.out.println("main start");
future.get(); // 等待任务完成
System.out.println("main end");
}
}
```
输出结果如下:
```
main start
main end
catch Error: this is error
done
```
在JavaScript中,`Future`和`sync`都是用于处理异步任务的方法,但它们的工作机制有所不同。
* `Future({})`方法会将任务放入事件队列中,然后在主事件循环的下一个迭代中执行。这是同步模式,意味着当前线程会被阻塞,直到任务完成。这种方式的优点是易于使用和理解,但缺点是性能可能不如`microtask`,因为它可能会导致线程阻塞。以下是一个示例:
```javascript
Future(() => {
print('future do..');
return '1';
}).then(print);
Future.microtask(() => {
print('microtask do');
return '4';
}).then(print);
Future.sync(() => {
print('sync do');
return '5';
}).then(print);
print('main end');
```
在这个例子中,我们首先打印 "future do..",然后打印 "sync do",最后打印 "microtask do"。这是因为JavaScript的事件循环是这样工作的:首先处理所有的微任务,然后处理主任务。所以我们的 "future do.." 在 "microtask do" 之前打印。
* `sync(() {})`函数是另一种将任务放入主线程的方法。与`Future({})`不同,这个函数不会将任务放在事件队列中,而是直接调用给定的函数。这意味着如果这个函数中有阻塞的操作(例如I/O操作),那么整个程序都会被阻塞,直到这个函数完成。以下是一个示例:
```javascript
Future.sync(() => {
print('sync do');
return '5';
}).then(print);
print('main end');
```
在这个例子中,我们的 "sync do" 将比 "microtask do" 更早地打印,因为它直接在主线程中执行,没有等待其他任务完成。
以下是重构后的内容:
```dart
import 'dart:async';
void main() async {
print('main start');
var v = await getComplete(1, 0);
print('main end');
}
Future
if (b == 0) {
return Future.error([Exception('b cannot be 0')]);
}
return Future.value('a'~/b);
}
void print(String message) {
print(message);
}
```
输出结果:
```yaml
main start
time out done
main end
```
这段代码中存在一个未处理的异常,导致程序结束并返回错误代码255。为了解决这个问题,我们需要在调用`Future.wait()`方法时添加一个`try-catch`语句来捕获异常。另外,我们需要修复`cleanUp`方法的参数,将其从`void`改为接受一个`T`类型的参数。以下是修改后的代码:
```dart
import 'package:dart:async';
Future> wait(Iterable
try {
List
if (eagerError) {
for (var future in futures) {
if (await future.isCompletedExceptionally) {
throw future.exception;
}
}
}
return value;
} catch (e) {
if (eagerError) {
throw e;
} else {
print('Error: $e');
}
} finally {
for (var future in futures) {
if (!await future.isDone) {
break;
}
}
}
}
Future
await Future.delayed(const Duration(seconds: 3));
return num * num;
}
Future
await Future.delayed(const Duration(seconds: 2));
return value + 'abc';
}
void main() async {
int start = DateTime.now().millisecondsSinceEpoch;
List
int cost = DateTime.now().millisecondsSinceEpoch-start;
print('cost:${cost/1000} ms, value:$value');
}
```
输出结果如下:
```
cost:3025 ms, value:[4, aabc, 4, babc]
```
```dart
import 'dart:async';
Future
await Future.delayed(Duration(milliseconds: delay));
yield 'number';
}
Future
await Future.delayed(Duration(milliseconds: 100));
yield value;
}
void main() async {
int start = DateTime.now().millisecondsSinceEpoch;
dynamic value = await Future.any
delayedNumber(1),
delayedString('a'),
delayedNumber(1),
delayedString('b'),
]);
int cost = DateTime.now().millisecondsSinceEpoch - start;
print('cost:${cost / 1000}s, value:$value');
}
```
输出结果:
```
cost:2.019s, value:a
```
以下是重构后的代码:
```dart
import 'dart:async';
void main() async {
print('main start');
await Future.forEach([1, 2, 3, 4], (element) async {
print(element);
return Future.value('a');
});
print('main end');
}
Future
int value = 0;
while (true) {
await Future.delayed(Duration(seconds: 1));
value++;
if (value == 3) {
return Future.complete();
}
}
});
void call(String callback) async {
await doWhile();
print('Finished with $callback');
}
```
输出结果如下:
```
main start
1
2
3 a
4 a null
main end
Finished with a
```
```kotlin
import kotlin.coroutines.*
import kotlin.concurrent.*
fun main() = runBlocking {
print("main start")
val future = testCompleter()
future.then(print)
print("main end")
}
suspend fun testCompleter(): CompletableFuture
val c = Completer
call(c) { value ->
continuation.resume(value)
}
c.future
}
fun call(callback: (Int) -> Unit) = Future.delayed(Duration.ofSeconds(1)).flatMapLatest { _ -> callback(123) }
fun print(message: String) = println(message)
```
输出:
```
main start
main end
123
Process finished with exit code 0
```