import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
*
* @author Kaiwii Ho
* Callable类就是一个有返回值的任务
* 对于任务与Thread之间的关系,可以这样子理解:
* Callable类的实例就是一个锦囊妙计;而Thread就是执行这个锦囊妙计的过程
*
* FutureTask类(Future接口的一个实现)就是一个监视器:检测着被若干个异步线程操作的变量的一个类
*
* 代码演示了主线程如何通过使用Callable类和FutureTask类,实现:
* 主线程一边等待子线程的处理结果,一边完成自己的工作。
*
*考虑以下一个小黑工kaiwii的故事……
*/
public class TestFutureTask {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//准备一份工作给一个打工仔employee叫Kaiwii
Employee kaiwii=new Employee("kaiwii");
//新建一个监工头inspector
FutureTask<Double>inspector=new FutureTask<Double>(kaiwii);
//让kaiwii这个打工仔工作
System.out.println("老板发话,让kaiwii这个打工仔工作吧!");
new Thread(inspector).start();
System.out.println("老板开始数钱!");
//老板一边数钱,一边命令监工inspector监视Kaiwii工作;一旦kaiwii完成工作就拿来让他检查
while(!inspector.isDone()){
System.out.println("老板数钱中……");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//老板交监工inspector将kaiwii的结果呈上来以便他验收kaiwii计算出来的结果
try {
System.out.println("老板发现kaiwii的结果是:"+inspector.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//子线程
class Employee implements Callable<Double>{
String employee_name;
private void setEmployee_name(String employee_name) {
this.employee_name = employee_name;
}
public Employee(String employee_name) {
setEmployee_name(employee_name);
}
@Override
public Double call() throws Exception {
// TODO Auto-generated method stub
System.out.println("工人"+employee_name+"说:我开始工作了!!!!");
for(int i=1;i<=10;i++){
System.out.println("工人"+employee_name+" 第"+i+"次说:我在工作呢!!!!");
Thread.sleep(1000);
}
System.out.println("工人"+employee_name+"说:我搞好了!!!!");
return Math.random();
}
}
分享到:
相关推荐
总之,要实现有返回值的线程,我们可以使用Java的`Callable`接口和`Future`、`ExecutorService`等工具,这些机制允许我们在异步环境中获取任务执行的结果。对于`jdbctest`,可能包含的是使用JDBC进行数据库操作的多...
4. **使用线程句柄**:易语言允许通过线程句柄发送消息,线程执行完毕后,可以通过发送特定消息将数据返回。 5. **回调函数**:线程执行过程中,可以设定一个回调函数,当线程执行完毕,将数据通过回调函数返回。 ...
异步调用是指在一个线程中启动一个操作,但并不等待其完成就继续执行后续操作。当这个操作完成后,会通过某种方式通知调用者。这种机制在处理耗时任务时非常有用,因为它可以让用户界面或其他线程不受阻塞地运行。 ...
线程异步工作是指线程之间不直接依赖彼此的执行顺序,它们可以独立地执行任务,并通过某种机制交换信息。这种方式能够充分利用多核处理器的计算能力,提高程序的并行性和响应速度。在C++中,可以使用`std::async`、`...
在C#中,异步线程是一个非常重要的概念,通过使用委托的BeginInvoke方法,可以实现异步线程的执行。在本文中,我们将详细介绍如何使用委托的BeginInvoke方法来实现异步线程,以及相关的知识点。 一、什么是委托? ...
我们可以将这些操作放到后台线程,并通过异步委托在完成后更新UI。 ```csharp // 创建一个异步委托,使用Lambda表达式封装后台计算 AsyncCallback callback = ar => { // 在这里,我们回到了UI线程,安全地更新UI ...
在这个例子中,`GetDataAsync`返回一个`Task<string>`,表示该方法将异步执行并返回一个字符串。`await Task.Delay(1000)`是一个模拟的延迟操作,表示在获取数据之前需要等待1秒。实际情况下,这可能是发送网络请求...
run()方法是线程执行的主要逻辑,不包含任何返回值。例如: ```java public class MyTask implements Runnable { @Override public void run() { // 这里编写线程执行的代码 } } ``` 2. **创建Thread对象*...
在这个例子中,`WorkerObject`被移动到`workerThread`,当`doWork`信号被发出时,`handleWorkResult`槽将在主线程中异步执行,保证了UI的及时更新和数据的安全访问。 总之,理解和熟练运用`moveToThread`、`connect...
在C#中,可以使用`Task`和`async/await`关键字来实现异步操作,获取子线程返回值: ```csharp Task<int> task1 = Task.Run(() => { // 子线程1的代码,返回一个int }); Task<int> task2 = Task.Run(() => { // ...
在异步方法执行完成后,我们可以使用 Future 对象来接收返回值。Future 对象提供了获取异步方法执行结果的方法,例如 get() 方法可以获取异步方法的执行结果。 @GetMapping("test") public Integer methodA() ...
在多线程上下文中,我们可以创建一个委托实例来封装需要在UI线程中执行的方法,如`OutText`函数。这里的`OutDelegate`是自定义的委托类型,定义了一个接受`string`参数的方法。 调用UI更新方法时,我们使用控件的`...
在C#中,多线程是程序设计中的一个重要概念,它允许程序同时执行多个操作,从而提高程序的效率和响应性。然而,在某些情况下,我们可能需要终止正在运行的所有线程,这通常发生在应用程序需要关闭或者某个关键错误...
线程取消可以是异步的,也可以是延迟的,这意味着被请求取消的线程将在下一个取消点返回,除非它已经被设置了延迟取消。与线程取消相关的pthread函数包括pthread_cancel()、pthread_setcancelstate()和pthread_...
pthread_join()函数可以等待指定线程结束,并获取其返回值。 7. 杂项函数 文档中还提到了一些其他相关函数,包括: - 获取本线程ID:pthread_self()函数可以获取当前线程的ID。 - 判断两个线程是否为同一线程:...
MFC多线程是MFC库中的一个重要特性,允许开发者在同一个应用程序中创建和管理多个执行线程,从而实现并发处理任务,提高程序效率。在Windows操作系统中,多线程技术广泛应用于UI更新、后台数据处理、异步操作等场景...
LPTHREAD_START_ROUTINE lpStartAddress, // 线程入口点,即线程开始执行的函数 LPVOID lpParameter, // 传递给线程入口点的参数 DWORD dwCreationFlags, // 创建标志,例如同步或异步 LPDWORD lpThreadId // ...