在做一个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`存储每个线程的局部结果,最后主线程遍历`...
获取响应时,通过`HttpWebRequest.GetResponse()`方法得到`HttpWebResponse`对象,然后可以读取响应的`ContentLength`等属性来处理文件传输。多线程下载文件通常会创建多个`HttpWebRequest`实例,每个实例负责下载...
计算结果 = 计算任务() // 假设计算任务是一个函数,计算完成后得到结果 设置线程变量( .线程句柄, .计算结果 ) // 将计算结果存入线程变量 结束线程() // 结束当前线程 ``` 在这个例子中,`.线程函数`是线程执行...
这样做的好处是其他线程可以得到线程执行的结果。但如果不及时进行pthread_join(),可能会导致资源泄露,因为线程资源仍然占用,直到pthread_join()被调用。 2. **Detached状态**:当线程创建时被设置为detached...
`CompletionService`通过`Future`接口返回每个任务的结果,使得我们可以在任务完成的瞬间得到结果,而无需等待所有任务执行完毕。这对于处理大批量任务并需要实时处理结果的场景非常有用。 在提供的`ThreadDemo`...
4. **线程同步**:在工作者线程中处理完数据后,可能需要将结果返回给主线程。此时,需要使用同步机制,如`CSemaphore`、`CCriticalSection`或者`CEvent`,以确保数据安全地在两个线程间传递,避免竞态条件。 5. **...
通过提交任务给`ExecutorService`,我们可以得到一个`Future`对象,这个对象提供了检查任务是否完成、获取结果或者取消任务的方法。 例如,可以使用`Callable`接口来定义一个返回结果的线程任务,然后用`...
I/O深度是指一个线程可以同时提交多少个I/O请求。 - `bs=4k`: 表示每个I/O请求的大小为4KB。 - `direct=1`: 表示使用直接I/O模式,绕过标准缓存机制直接与设备交互。 - `rw=randrw`: 表示读写模式为随机读写。 ####...
- 响应性:UI线程可以快速响应用户操作,而后台线程处理耗时任务,避免程序卡顿。 - 资源共享:线程间可以直接访问同一进程的内存,减少数据交换开销。 3. **线程的创建与管理**: - 在许多编程语言中(如Java、...
4. **线程优先级**:某些系统允许为线程设置优先级,高优先级的线程可能获得更多的CPU时间。然而,过度依赖优先级可能导致优先级反转和优先级继承问题,因此在实际应用中应谨慎使用。 5. **线程池**:为了避免频繁...
`lock`是最常用的一种,用于确保同一时间只有一个线程可以访问特定代码块: ```csharp lock (obj) { // 临界区代码,只有获得锁的线程才能执行 } ``` 3. **后台线程(Background Threads)**: 默认情况下,...
当线程获得执行权时,它会调用指定的线程函数开始执行。线程函数是线程的入口点,它定义了线程执行的任务。例如,我们可以在线程函数中实现I/O操作、计算任务或其他特定功能。 在多线程环境中,数据同步和互斥是...
此外,还可以通过实现Callable接口并使用FutureTask包装来创建可返回结果的线程。 二、线程的生命周期 线程有新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)五个状态。理解...
// 使用参数执行任务并得到结果 FResult := Format('处理结果: %d', [FParam1]); // 任务完成后触发事件 FEvent.SetEvent; end; function TMyThread.GetResult: string; begin Result := FResult; end; // ...
线程可以通过调用`pthread_exit`函数来终止其自身的执行,函数原型如下: ```c void pthread_exit(void *retval); ``` 其中`retval`参数是线程退出时的返回值,可用于传递线程执行的结果,供其他线程或主线程获取...
1. **互斥量(Mutex)**:互斥量提供了一种独占访问资源的方式,同一时间只有一个线程可以持有互斥量并访问资源。在C++中,我们可以使用`std::mutex`来实现。当一个线程获得互斥锁后,其他尝试获取的线程将被阻塞,...
2. 当有线程持有读锁时,其他线程可以继续获取读锁,但不能获取写锁。 3. 当有线程持有写锁时,其他线程既不能获取读锁,也不能获取写锁。 4. 持有锁的线程释放锁后,其他线程按照等待顺序获取锁。 在易语言中,...
在Windows系统编程中,`CCriticalSection`类是实现线程锁的一种方式,它提供了一种线程同步机制,确保同一时间只有一个线程可以访问特定的代码段或数据。 `CCriticalSection`是Microsoft的Active Template Library ...
Future 可以使线程在未来某个时间点获得结果。 7. Threads Threads 是 C++11 的线程库的核心,定义在 `<thread>` 头文件中。Threads 可以使程序跨多个核(心)运行,提高程序的执行效率。 C++11 的线程库提供了一...