在做一个Android应用,该应用需要与服务器通信,需要想服务器发送请求,并处理返回的信息。看起来很好实现,用Android的URL访问服务器地址。但是之前的我一直不知道java1.5以后有了Callable这个东东,而还在为怎么获得执行网络访问返回的数据犯愁。通过FutureTask与Callable可以在需要的时候获得返回值。这样就可以很方便的在执行网络访问后处理返回的数据。
关于FutureTask与Callable及java的并发知识还是得继续学习。
下面是一个小例子:
public void testTreand(){ FutureTask<Integer> task = new FutureTask<Integer>(new Callable<Integer>() {//java8中可以使用lambda表达式 @Override public Integer call() throws Exception {//与run方法类似,只是这里有返回值 int num = 0; for(int i=0; i<100; i++){ num += 1; System.out.println(Thread.currentThread().getName()+"->"+ num); } return num; } }); Thread thread = new Thread(task,"子线程"); thread.start(); for(int i=0; i<100; i++){ System.out.println(Thread.currentThread().getName()+"->"+i); } try { System.out.println("子线程返回结果:"+task.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } }
这个例子知识简单的介绍了FutureTask与Callable的使用,网上有更多详细的介绍。
相关推荐
例如,每个线程可以使用`AtomicInteger`累加计算结果,当所有线程执行完后,主线程可以通过读取`AtomicInteger`的值来获取汇总的结果。或者,使用`ConcurrentHashMap`存储每个线程的局部结果,最后主线程遍历`...
`CompletionService`通过`Future`接口返回每个任务的结果,使得我们可以在任务完成的瞬间得到结果,而无需等待所有任务执行完毕。这对于处理大批量任务并需要实时处理结果的场景非常有用。 在提供的`ThreadDemo`...
4. **线程同步**:在工作者线程中处理完数据后,可能需要将结果返回给主线程。此时,需要使用同步机制,如`CSemaphore`、`CCriticalSection`或者`CEvent`,以确保数据安全地在两个线程间传递,避免竞态条件。 5. **...
计算结果 = 计算任务() // 假设计算任务是一个函数,计算完成后得到结果 设置线程变量( .线程句柄, .计算结果 ) // 将计算结果存入线程变量 结束线程() // 结束当前线程 ``` 在这个例子中,`.线程函数`是线程执行...
通过提交任务给`ExecutorService`,我们可以得到一个`Future`对象,这个对象提供了检查任务是否完成、获取结果或者取消任务的方法。 例如,可以使用`Callable`接口来定义一个返回结果的线程任务,然后用`...
- 响应性:UI线程可以快速响应用户操作,而后台线程处理耗时任务,避免程序卡顿。 - 资源共享:线程间可以直接访问同一进程的内存,减少数据交换开销。 3. **线程的创建与管理**: - 在许多编程语言中(如Java、...
4. **线程优先级**:某些系统允许为线程设置优先级,高优先级的线程可能获得更多的CPU时间。然而,过度依赖优先级可能导致优先级反转和优先级继承问题,因此在实际应用中应谨慎使用。 5. **线程池**:为了避免频繁...
`lock`是最常用的一种,用于确保同一时间只有一个线程可以访问特定代码块: ```csharp lock (obj) { // 临界区代码,只有获得锁的线程才能执行 } ``` 3. **后台线程(Background Threads)**: 默认情况下,...
Random类可以生成一系列伪随机数,可以根据需要设定种子值以获得不同的序列。在程序中,可能先创建一个Random实例,然后多次调用其Next()方法生成100个不重复的数字。 多线程访问网页的部分,通常会使用到...
当线程获得执行权时,它会调用指定的线程函数开始执行。线程函数是线程的入口点,它定义了线程执行的任务。例如,我们可以在线程函数中实现I/O操作、计算任务或其他特定功能。 在多线程环境中,数据同步和互斥是...
此外,还可以通过实现Callable接口并使用FutureTask包装来创建可返回结果的线程。 二、线程的生命周期 线程有新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)五个状态。理解...
1. **互斥量(Mutex)**:互斥量提供了一种独占访问资源的方式,同一时间只有一个线程可以持有互斥量并访问资源。在C++中,我们可以使用`std::mutex`来实现。当一个线程获得互斥锁后,其他尝试获取的线程将被阻塞,...
// 使用参数执行任务并得到结果 FResult := Format('处理结果: %d', [FParam1]); // 任务完成后触发事件 FEvent.SetEvent; end; function TMyThread.GetResult: string; begin Result := FResult; end; // ...
在Windows系统编程中,`CCriticalSection`类是实现线程锁的一种方式,它提供了一种线程同步机制,确保同一时间只有一个线程可以访问特定的代码段或数据。 `CCriticalSection`是Microsoft的Active Template Library ...
Future 可以使线程在未来某个时间点获得结果。 7. Threads Threads 是 C++11 的线程库的核心,定义在 `<thread>` 头文件中。Threads 可以使程序跨多个核(心)运行,提高程序的执行效率。 C++11 的线程库提供了一...
为了解决这个问题,作者创建了一个名为`MyThread`的类,这个类封装了多线程执行和结果收集的功能。 `MyThread`类的构造函数接受一个可选参数`func_list`,这是一个列表,每个元素是一个包含`func`(函数引用)和`...
FutureTask 是 Java 中的一种非常重要的多线程设计模式,用于异步计算线程之间的结果传递。在 JDK 中,FutureTask 类是 Future 模式的实现,它实现了 Runnable 接口,作为单独的线程运行。在其 run() 方法中,通过 ...
2. 当有线程持有读锁时,其他线程可以继续获取读锁,但不能获取写锁。 3. 当有线程持有写锁时,其他线程既不能获取读锁,也不能获取写锁。 4. 持有锁的线程释放锁后,其他线程按照等待顺序获取锁。 在易语言中,...
3. 饥饿:线程长时间无法获得所需资源,导致无法执行。 七、线程优先级 Java线程有三个优先级:MIN_PRIORITY(1)、NORM_PRIORITY(5)、MAX_PRIORITY(10),但优先级并不保证执行顺序,只是提供一种调度建议。 ...
4. **线程安全**:线程安全的代码是指在多线程环境中,无论线程如何调度,都能正确执行并得到预期结果的代码。实现线程安全通常需要使用同步机制。 5. **线程优先级**:某些操作系统支持为线程设置优先级,高优先级...