`
xuyongping
  • 浏览: 123593 次
  • 性别: Icon_minigender_1
  • 来自: 部落格
社区版块
存档分类
最新评论

异步执行线程并可以得到返回值

 
阅读更多
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做异步线程

    在C#中,异步线程是一个非常重要的概念,通过使用委托的BeginInvoke方法,可以实现异步线程的执行。在本文中,我们将详细介绍如何使用委托的BeginInvoke方法来实现异步线程,以及相关的知识点。 一、什么是委托? ...

    带返回值的异步委托和lambada结合

    我们可以将这些操作放到后台线程,并通过异步委托在完成后更新UI。 ```csharp // 创建一个异步委托,使用Lambda表达式封装后台计算 AsyncCallback callback = ar =&gt; { // 在这里,我们回到了UI线程,安全地更新UI ...

    C# 异步 返回值例子

    在这个例子中,`GetDataAsync`返回一个`Task&lt;string&gt;`,表示该方法将异步执行并返回一个字符串。`await Task.Delay(1000)`是一个模拟的延迟操作,表示在获取数据之前需要等待1秒。实际情况下,这可能是发送网络请求...

    实例123 新建无返回值的线程

    run()方法是线程执行的主要逻辑,不包含任何返回值。例如: ```java public class MyTask implements Runnable { @Override public void run() { // 这里编写线程执行的代码 } } ``` 2. **创建Thread对象*...

    QT+moveToThread线程+connect信号槽+信号返回值

    在这个例子中,`WorkerObject`被移动到`workerThread`,当`doWork`信号被发出时,`handleWorkResult`槽将在主线程中异步执行,保证了UI的及时更新和数据的安全访问。 总之,理解和熟练运用`moveToThread`、`connect...

    多线程执行完后主程序再执行(包括需要子线程返回结果)

    在C#中,可以使用`Task`和`async/await`关键字来实现异步操作,获取子线程返回值: ```csharp Task&lt;int&gt; task1 = Task.Run(() =&gt; { // 子线程1的代码,返回一个int }); Task&lt;int&gt; task2 = Task.Run(() =&gt; { // ...

    SpringBoot异步调用方法并接收返回值

    在异步方法执行完成后,我们可以使用 Future 对象来接收返回值。Future 对象提供了获取异步方法执行结果的方法,例如 get() 方法可以获取异步方法的执行结果。 @GetMapping("test") public Integer methodA() ...

    C_多线程函数如何传参数和返回值[文].pdf

    在多线程上下文中,我们可以创建一个委托实例来封装需要在UI线程中执行的方法,如`OutText`函数。这里的`OutDelegate`是自定义的委托类型,定义了一个接受`string`参数的方法。 调用UI更新方法时,我们使用控件的`...

    c# 多线程任务中结束全部线程

    在C#中,多线程是程序设计中的一个重要概念,它允许程序同时执行多个操作,从而提高程序的效率和响应性。然而,在某些情况下,我们可能需要终止正在运行的所有线程,这通常发生在应用程序需要关闭或者某个关键错误...

    Posix线程编程指南

    线程取消可以是异步的,也可以是延迟的,这意味着被请求取消的线程将在下一个取消点返回,除非它已经被设置了延迟取消。与线程取消相关的pthread函数包括pthread_cancel()、pthread_setcancelstate()和pthread_...

    Posix_线程编程指南

    pthread_join()函数可以等待指定线程结束,并获取其返回值。 7. 杂项函数 文档中还提到了一些其他相关函数,包括: - 获取本线程ID:pthread_self()函数可以获取当前线程的ID。 - 判断两个线程是否为同一线程:...

    MFC多线程例子

    MFC多线程是MFC库中的一个重要特性,允许开发者在同一个应用程序中创建和管理多个执行线程,从而实现并发处理任务,提高程序效率。在Windows操作系统中,多线程技术广泛应用于UI更新、后台数据处理、异步操作等场景...

    windows API 线程的创建

    LPTHREAD_START_ROUTINE lpStartAddress, // 线程入口点,即线程开始执行的函数 LPVOID lpParameter, // 传递给线程入口点的参数 DWORD dwCreationFlags, // 创建标志,例如同步或异步 LPDWORD lpThreadId // ...

Global site tag (gtag.js) - Google Analytics