import 'dart:async';
import 'dart:isolate';
import 'dart:math';
void main() async {
print('🚀 Dart 并发编程示例开始');
await futureExamples();
await streamExamples();
await isolateExamples();
await practicalExamples();
print('✅ 所有示例执行完成');
}
Future<void> futureExamples() async {
print('\n📦 Future 示例');
await basicFutureOperations();
await parallelExecution();
await errorHandlingExample();
}
Future<void> basicFutureOperations() async {
print('\n1. 基本 Future 操作');
final immediate = Future.value('立即完成');
print('立即值: ${await immediate}');
final delayed = Future.delayed(
Duration(milliseconds: 500),
() => '延迟500ms完成',
);
print('延迟值: ${await delayed}');
final chainResult = await Future.value(
'hello',
).then((value) => value.toUpperCase()).then((value) => '$value WORLD');
print('链式调用结果: $chainResult');
}
Future<void> parallelExecution() async {
print('\n2. 并发执行示例');
final stopwatch = Stopwatch()..start();
final tasks = [
simulateNetworkCall('用户数据', 1000),
simulateNetworkCall('商品列表', 1500),
simulateNetworkCall('订单历史', 800),
];
final results = await Future.wait(tasks);
stopwatch.stop();
print('并发执行结果:');
results.forEach(print);
print('总耗时: ${stopwatch.elapsedMilliseconds}ms');
}
Future<String> simulateNetworkCall(String dataType, int delayMs) async {
await Future.delayed(Duration(milliseconds: delayMs));
return '$dataType 加载完成 (${delayMs}ms)';
}
Future<void> errorHandlingExample() async {
print('\n3. 错误处理示例');
try {
await Future.delayed(Duration(milliseconds: 100), () {
throw Exception('模拟网络错误');
});
} catch (e) {
print('捕获异常: $e');
}
final result = await Future.value('正常数据')
.then((value) {
if (Random().nextBool()) {
throw Exception('随机错误');
}
return value;
})
.catchError((error) => '默认数据: $error')
.whenComplete(() => print('清理资源'));
print('最终结果: $result');
try {
await Future.delayed(
Duration(seconds: 2),
() => '慢响应',
).timeout(Duration(seconds: 1));
} on TimeoutException {
print('请求超时');
}
}
Future<void> streamExamples() async {
print('\n🌊 Stream 示例');
await basicStreamOperations();
await streamTransformations();
await broadcastStreamExample();
}
Future<void> basicStreamOperations() async {
print('\n1. 基本 Stream 操作');
final numberStream = Stream.fromIterable([1, 2, 3, 4, 5]);
print('数字流:');
await for (int number in numberStream) {
print(' 收到数字: $number');
}
print('\n定期数据流:');
await Stream.periodic(
Duration(milliseconds: 200),
(count) => 'tick $count',
).take(3).forEach(print);
}
Future<void> streamTransformations() async {
print('\n2. Stream 转换操作');
final sourceStream = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
print('原始数据: 1-10');
final transformedStream = sourceStream
.where((x) => x % 2 == 0)
.map((x) => x * x)
.take(3);
print('偶数平方(前3个):');
await transformedStream.forEach((value) => print(' $value'));
print('\n异步转换:');
final asyncStream = Stream.fromIterable(['a', 'b', 'c']).asyncMap((
letter,
) async {
await Future.delayed(Duration(milliseconds: 100));
return letter.toUpperCase();
});
await asyncStream.forEach(print);
}
Future<void> broadcastStreamExample() async {
print('\n3. Broadcast Stream 示例');
final controller = StreamController<String>.broadcast();
controller.stream.listen((data) => print('监听器1: $data'));
controller.stream.listen((data) => print('监听器2: $data'));
controller.add('广播消息 1');
controller.add('广播消息 2');
await Future.delayed(Duration(milliseconds: 100));
controller.close();
}
Future<void> isolateExamples() async {
print('\n🔀 Isolate 示例');
await basicIsolateExample();
await heavyComputationExample();
}
Future<void> basicIsolateExample() async {
print('\n1. 基础 Isolate 通信');
final receivePort = ReceivePort();
await Isolate.spawn(_isolateEntryPoint, {
'sendPort': receivePort.sendPort,
'message': '来自主 Isolate 的消息',
});
final response = await receivePort.first;
print('收到 Isolate 响应: $response');
}
void _isolateEntryPoint(Map<String, dynamic> params) {
final SendPort sendPort = params['sendPort'];
final String message = params['message'];
final response = '处理完成: $message';
sendPort.send(response);
}
Future<void> heavyComputationExample() async {
print('\n2. CPU 密集型计算 (使用 compute)');
final numbers = List.generate(1000000, (i) => i);
print('开始计算大数组的和...');
final stopwatch = Stopwatch()..start();
final result = await compute(_calculateSum, numbers);
stopwatch.stop();
print('计算结果: $result');
print('计算耗时: ${stopwatch.elapsedMilliseconds}ms');
}
int _calculateSum(List<int> numbers) {
return numbers.reduce((a, b) => a + b);
}
Future<void> practicalExamples() async {
print('\n🏗️ 实际应用示例');
await dataFetchingService();
await reactiveDataModel();
}
Future<void> dataFetchingService() async {
print('\n1. 数据获取服务');
final service = DataService();
final userIds = [1, 2, 3, 4, 5];
final users = await service.fetchMultipleUsers(userIds);
print('获取到 ${users.length} 个用户:');
users.forEach((user) => print(' ${user['name']} (ID: ${user['id']})'));
}
Future<void> reactiveDataModel() async {
print('\n2. 响应式数据模型');
final repository = UserRepository();
final subscription = repository.users.listen((users) {
print('用户数据更新: ${users.length} 个用户');
});
repository.search('张');
await Future.delayed(Duration(milliseconds: 100));
repository.search('李');
await Future.delayed(Duration(milliseconds: 100));
repository.search('王');
await Future.delayed(Duration(milliseconds: 500));
subscription.cancel();
repository.dispose();
}
class DataService {
Future<List<Map<String, dynamic>>> fetchMultipleUsers(
List<int> userIds,
) async {
final futures = userIds.map((id) => _fetchUser(id));
return Future.wait(futures);
}
Future<Map<String, dynamic>> _fetchUser(int id) async {
await Future.delayed(Duration(milliseconds: 100 + Random().nextInt(200)));
final names = ['张三', '李四', '王五', '赵六', '钱七'];
return {
'id': id,
'name': names[id % names.length],
'email': 'user$id@example.com',
};
}
}
class UserRepository {
final _usersController =
StreamController<List<Map<String, dynamic>>>.broadcast();
final _searchController = StreamController<String>();
late StreamSubscription _searchSubscription;
Stream<List<Map<String, dynamic>>> get users => _usersController.stream;
UserRepository() {
_searchSubscription = _searchController.stream
.distinct()
.asyncMap((query) => _searchUsers(query))
.listen((users) => _usersController.add(users));
}
void search(String query) {
_searchController.add(query);
}
Future<List<Map<String, dynamic>>> _searchUsers(String query) async {
await Future.delayed(Duration(milliseconds: 200));
final allUsers = [
{'id': 1, 'name': '张三丰'},
{'id': 2, 'name': '李白'},
{'id': 3, 'name': '王维'},
{'id': 4, 'name': '赵云'},
{'id': 5, 'name': '钱学森'},
];
return allUsers
.where((user) => (user['name'] as String).contains(query))
.toList();
}
void dispose() {
_searchSubscription.cancel();
_usersController.close();
_searchController.close();
}
}
Future<R> compute<Q, R>(R Function(Q) callback, Q message) async {
final receivePort = ReceivePort();
await Isolate.spawn(_computeEntryPoint, {
'message': message,
'sendPort': receivePort.sendPort,
});
return await receivePort.first as R;
}
void _computeEntryPoint(Map<String, dynamic> params) {
final List<int> message = params['message'];
final SendPort sendPort = params['sendPort'];
try {
final result = message.reduce((a, b) => a + b);
sendPort.send(result);
} catch (error) {
sendPort.send(error);
}
}