利用多线程,执行有返回值的方法

解决的问题:

1. 当需要拿到多线程执行的方法的结果

2. 如何让主线程,等在所有的子线程直接结束

class Program
    {
        static void Main(string[] args)
        {

            IList<ManualResetEvent> listManual = new List<ManualResetEvent>();
            List<ThreadReturnData> testList = new List<ThreadReturnData>();
            for (int i = 0; i < 10; i++)
            {
                ThreadReturnData temp = new ThreadReturnData();
                temp.manual = new ManualResetEvent(false);
                temp.parm = "test";
                listManual.Add(temp.manual);
                testList.Add(temp);
                ThreadPool.QueueUserWorkItem(new WaitCallback(temp.ReturnThreadData), i);
            }

            //等待本次查询线程全部执行完毕
            if (listManual.Count > 0)
            {
                WaitHandle.WaitAll(listManual.ToArray());
            }

            foreach (var item in testList)
            {
                Console.WriteLine(item.result);  //异步的结果
            }

        }

        public class ThreadReturnData
        {
            public ManualResetEvent manual;
            public string parm;
            public string result;

            public void ReturnThreadData(object info)
            {
                result = parm + info.ToString();
                manual.Set();
            }
        }

在给子线程需要执行的方法传递参数的时候,可以用两种方法,一种给该方法直接传个参数例如上面的“i",还有一种方法就是,对于子线程需要执行的ReturnThreadData方法所在的实例temp设置一个属性(parm),在需要执行方法钱给该属性赋值( temp.parm = "test"),那么在方法中可以直接调用本实例的属性。如何或者子线程执行的结果呢,原理更给参数赋值的第二种方式原理一样,在方法所在的类ThreadReturnData中设置一个结果属性(result),在方法执行完后把结果直接赋值给result,那么在主线程的temp实例中就可以获取到执行的结果result。那么为什么主线程和子线程都能访问到temp实例呢,temp实例实在主线程中创建的,在传给子线程需要执行的WaitCallBack委托的时候,是把temp实例的ReturnThreadData传递给了该委托。但同时也会ReturnThreadData实例方法所在的实例也传给委托(有个隐含的this参数就是temp实例),所以在执行委托方法时候可以直接引用到方法所在实例的属性。本质上也就是引用类型的传递,只要引用类型的数据在某处引用的地方发生变化,那么在所以其他引用了这个引用类型的地方都可以获取到这个变化。

时间: 2024-10-02 22:19:35

利用多线程,执行有返回值的方法的相关文章

Selenium2学习-036-WebUI自动化实战实例-034-JavaScript 在 Selenium 自动化中的应用实例之六(获取 JS 执行结果返回值)

Selenium 获取 JavaScript 返回值非常简单,只需要在 js 脚本中将需要返回的数据 return 就可以,然后通过方法返回 js 的执行结果,方法源码如下所示: 1 /** 2 * Get Object of return from js 3 * 4 * @author Aaron.ffp 5 * @version V1.0.0: autoSeleniumDemo main.aaron.sele.core SeleniumCore.java execJSR, 2015-8-9

可否定义拥有返回值的方法的委托链

分析问题 委托的方法可以是无返回的方法,也可以是有返回值的方法.回顾一下委托的使用: Meth a=new Meth(Method1); a+=new Meth(Method2); a+=new Meth(Method3); int returnVal=a(); 当使用类似的代码时,委托链表中各个方法的返回值起了冲突,最后一行代码只从委托中取得一个返回值,而事实上该委托链表包含三个方法,而每个方法都具有一个返回值.读者将会看到,当这样使用委托时,只有委托链表上最后被调用的方法返回值才被返回.以下

Java加载jar文件并调用jar文件当中有参数和返回值的方法

在工作当中经常遇到反编译后的jar文件,并要传入参数了解其中的某些方法的输出,想到Java里面的反射可以实现加载jar文件并调用其中的方法来达到自己的目的.就写了个Demo代码. 以下的类可以编译生成hello.jar文件. 1 package org.lele.fatpanda; 2 3 public class Util 4 { 5 public static String myName; 6 /* 7 * 无参数,无返回值的方法. 8 */ 9 public static void get

在命令行处理 console 应用执行的返回值

在命令行处理 console 应用执行的返回值. 新建一 Win32 Console 工程: CompareDirs 代码如下(VS2008 默认生成的代码): 1 // CompareDirs.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include "CompareDirs.h" 6 7 #ifdef _DEBUG 8 #define new DEBUG_NEW 9 #endif 10 11 12

13 继续C#中的方法,带返回值的方法介绍

在这一个练习中,我们要使用带返回值的方法.如果一个方法带返回值,那么它的形式是这样的. 定义一个带返回值的C#方法 static 返回类型 方法名字 (参数类型 参数1的名字,参数类型 参数2的名字) { 你的代码 return 返回值 } static: 先不用管是什么意思.在没有讲它的含义之前,在你写的每个方法中都要加上它. 返回类型:就是我们前面讲过的数据类型,int,string等等.通常一个方法调用后要给调用这个方法的地方返回一个值. 方法名字:你可以给方法起一个你想要的名字.不能瞎起

Thead线程篇之-----多线程 实现 有返回值的功能

import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class MyCallBack implements Callable<String>{ private String threadName; public MyCallBack() { } public MyCallBack(S

定义一个带参带返回值的方法,实现输出随机数数组

public class mains { public static void main(String[] args) { // 创建对象,对象名为hello mains hello = new mains(); // 调用方法并将返回值保存在变量中 int[] nums = hello.getArray(8); // 将数组转换为字符串并输出 System.out.println(Arrays.toString(nums)); } /* * 功能:创建指定长度的int型数组,并生成100以内随

执行带返回值的存储过程

记录下执行带返回值的存储过程 1.定义变量接收返回值@out [email protected]_product_catalogID = @out 定义返回值用@out接受,标记output GO--带返回值的存储过程执行DECLARE @out INT EXECUTE dbo.tb_product_catalog_INSERT @name = N'测试', -- nvarchar(100) @brand_id = 0, -- int @parent_id = 0, -- int @custid

Java 中无返回值的方法在使用时应该注意的问题

Java 中的方法是形态多样的.无返回值的方法在使用时应该规避哪些问题呢? 一.不可以打印调用或是赋值调用,只能是单独调用(非常重要): 二.返回值没有,不代表参数就没有: 三.不能return一个具体的值,否则会报错: 四.return分号可以直接省略: 五.无返回值方法应该使用类型void. 原文地址:https://www.cnblogs.com/yanglongbo/p/10981842.html