多线程测试并发

主要代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EWin.International.PolicyUpload.common;
using System.Collections;
using System.Threading;
using System.Globalization;

namespace test
{
    public partial class Form2 : Form
    {
        //private Dictionary<List<string>, Thread> _ThreadDictionary = new Dictionary<List<string>, Thread>();   //存储采集任务线程
        private int _MaxThreadCount = 4;
        private static int _intErrors = 0;
        private static int _intCorrects = 0;
        private static int _intSecent = 0;
        private static object thisLock = new object();
        private delegate void UpdateStatusDelegate(string status);

        private void UpdateStatus(string status)
        {
            this.textBox1.AppendText("\r\n" + status);
        }
        private void msgshow(string msg)
        {
            this.BeginInvoke(new UpdateStatusDelegate(UpdateStatus), new object[] { string.Format("{0}", msg) });
        }

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            ArrayList mylist = new ArrayList();
            mylist.Add(new DictionaryEntry("单程1", "1"));
            mylist.Add(new DictionaryEntry("往返2", "2"));
            cbb_triptype.DataSource = mylist;
            cbb_triptype.DisplayMember = "Key";
            cbb_triptype.ValueMember = "Value";

            mylist = new ArrayList();
            mylist.Add(new DictionaryEntry("TravelAgentSearch", "TravelAgentSearch"));
            mylist.Add(new DictionaryEntry("XinMinGSearch", "XinMinGSearch"));
            cbb_InterfaceType.DataSource = mylist;
            cbb_InterfaceType.DisplayMember = "Key";
            cbb_InterfaceType.ValueMember = "Value";

            //Form.CheckForIllegalCrossThreadCalls = false;
        }

        private void btn_ensure_Click(object sender, EventArgs e)
        {
            _intErrors = 0;
            _intCorrects = 0;
            textBox1.Text = "";
            string strtriptyp = cbb_triptype.SelectedValue.ToString();
            strtriptyp += ";" + cbb_InterfaceType.SelectedValue.ToString();
            ThreadPool.QueueUserWorkItem(new WaitCallback(this.dowork), strtriptyp);
        }

        private void dowork(object obj)
        {

            int intmaxcount = string.IsNullOrEmpty(txt_maxcount.Text) ? 20 : int.Parse(txt_maxcount.Text); //并发
            int inttimes = string.IsNullOrEmpty(txt_times.Text) ? 10 : int.Parse(txt_times.Text);//执行次数
            _intSecent = string.IsNullOrEmpty(txt_secend.Text) ? 1 : int.Parse(txt_secend.Text);//单位时间(毫秒
            List<string> listobj = new List<string>();
            DateTime dtfdate = DateTime.ParseExact(txt_fdate.Text, "yyyyMMdd", CultureInfo.InvariantCulture);
            string strobj = obj as string;
            string strtriptyp = strobj.Split(‘;‘)[0];
            string strinterfacetype = strobj.Split(‘;‘)[1];
            msgshow("==" + strinterfacetype + "测试==");
            DateTime dtrdate = DateTime.Now;
            if (strtriptyp == "2")
            {
                dtrdate = DateTime.ParseExact(txt_rdate.Text, "yyyyMMdd", CultureInfo.InvariantCulture);
            }
            msgshow("==begin==每" + _intSecent.ToString() + "秒并发" + intmaxcount.ToString() + ";共执行" + inttimes + "次====" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
            for (int i = 0; i < inttimes; i++)  //执行次数
            {
                msgshow("第" + (i + 1).ToString() + "次开始执行==" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                //并发次数 行程类型 始发 到达 始发日期 返回日期 当前执行序号
                listobj = new List<string>();
                listobj.Add(intmaxcount.ToString() + "|" + strtriptyp + "|" + txt_statcity.Text + "|" + txt_endcity.Text + "|" + dtfdate.ToString("yyyyMMdd") + "|" + ((string.IsNullOrEmpty(txt_rdate.Text) && strtriptyp == "2") ? "" : dtrdate.ToString("yyyyMMdd")) + "|" + (i + 1).ToString() + "|" + strinterfacetype);

                ThreadPool.QueueUserWorkItem(new WaitCallback(SearchHandler), listobj);
                Thread.Sleep(_intSecent * 1000);

                //common.test tt = new common.test();
                //ThreadPool.QueueUserWorkItem(new WaitCallback(tt.TravelAgentSearch), intmaxcount.ToString() + "|" + strtriptyp + "|" + txt_statcity.Text + "|" + txt_endcity.Text + "|" + dtfdate.ToString("yyyyMMdd") + "|" + ((string.IsNullOrEmpty(txt_rdate.Text) && strtriptyp == "2") ? "" : dtrdate.ToString("yyyyMMdd")) + "|" + (i + 1).ToString() + "|" + strinterfacetype);
                //dtfdate = dtfdate.AddDays(1);
                ////msgshow("Thread.Sleep:" + (_intSecent * 1000).ToString() + "毫秒");
            }
            msgshow("==end==每" + _intSecent.ToString() + "秒并发" + intmaxcount.ToString() + ";共执行" + inttimes + "次====" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "\r\n");

        }

        private void SearchHandler(object obj)
        {
            //Thread.Sleep(_intSecent * 1000);
            //msgshow("Thread.Sleep:" + (_intSecent* 1000).ToString() + "毫秒");

            //listobj:并发次数 行程类型 始发 到达 始发日期 返回日期
            List<string> listobj = obj as List<string>;
            string[] objlist = listobj[0].Split(‘|‘);
            int intmaxcount = int.Parse(objlist[0].ToString());
            _MaxThreadCount = intmaxcount;
            string stringtriptyp = objlist[1].ToString();
            string strstatcity = objlist[2].ToString();
            string strendcity = objlist[3].ToString();
            DateTime dtfdate = DateTime.ParseExact(objlist[4].ToString(), "yyyyMMdd", CultureInfo.InvariantCulture);
            DateTime dtrdate = DateTime.Now;
            if (!string.IsNullOrEmpty(objlist[5]))
                dtrdate = DateTime.ParseExact(objlist[5].ToString(), "yyyyMMdd", CultureInfo.InvariantCulture);

            Dictionary<List<string>, Thread> ThreadDictionary = new Dictionary<List<string>, Thread>();
            List<string> list;
            for (int i = 0; i < intmaxcount; i++)
            {
                list = new List<string>();
                DateTime dtnewfdate = dtfdate.AddDays(i);
                DateTime dtnewrdate = dtrdate.AddDays(i);
                //行程类型 始发 到达 始发日期 返回日期
                list.Add(stringtriptyp);
                list.Add(strstatcity);
                list.Add(strendcity);
                list.Add(dtnewfdate.ToString("yyyyMMdd"));
                list.Add((!string.IsNullOrEmpty(objlist[5].ToString()) && stringtriptyp == "2") ? dtnewrdate.ToString("yyyyMMdd") : null);
                list.Add(objlist[6].ToString());
                if (objlist[7].ToString() == "TravelAgentSearch")
                {

                    ThreadDictionary.Add(list, new Thread(new ParameterizedThreadStart(TravelAgentSearch), 5));
                }
                else
                {
                    ThreadDictionary.Add(list, new Thread(new ParameterizedThreadStart(XinMinGSearch), 5));
                }
            }
            ThreadPool.QueueUserWorkItem(new WaitCallback(this.TravelAgentSearchAll), ThreadDictionary);
        }

        private void TravelAgentSearchAll(object obj)
        {
            DateTime opTime = DateTime.Now;
            //msgshow("==开始==" + opTime.ToString("yyyy-MM-dd HH:mm:ss.fff"));
            //LogUtils.Info("==开始==" + opTime.ToString("yyyy-MM-dd HH:mm:ss.fff"));
            Dictionary<List<string>, Thread> ThreadDictionary = obj as Dictionary<List<string>, Thread>;
            #region 线程队列处理
            if (ThreadDictionary.Count > 0)
            {
                int maxThreadSize = _MaxThreadCount;                //最大并发线程数量
                int totalThreadCount = ThreadDictionary.Count;     //总线程数量

                {
                    int worksThreadSize = ThreadDictionary.Where(k => k.Value.IsAlive).Count();    //当前活动线程数量

                    if (worksThreadSize < maxThreadSize)
                    {
                        foreach (KeyValuePair<List<string>, Thread> item in ThreadDictionary.Where(k => k.Value.ThreadState.Equals(ThreadState.Unstarted)))
                        {
                            item.Value.Start(item.Key);
                            worksThreadSize++;
                            totalThreadCount--;
                            //达到最大活跃线程数量则跳出 Foreach 循环 , 重新执行 while 中代码.
                            if (worksThreadSize == maxThreadSize)
                                break;
                        }
                    }
                }
                //等待所有线程操作完成
                while (ThreadDictionary.Where(k => k.Value.IsAlive).Count() > 0) { }

                List<string> list = ThreadDictionary.Keys.LastOrDefault() as List<string>;
                msgshow("==第" + list[5] + "次======开始时间:" + opTime.ToString("yyyy-MM-dd HH:mm:ss.fff") + "结束时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "耗时:" + DateTime.Now.Subtract(opTime).TotalSeconds + "毫秒\n");
                msgshow("当前执行了" + (_intCorrects + _intErrors).ToString() + "次;" + "正确" + _intCorrects.ToString() + "次;" + "错误" + _intErrors.ToString() + "次==" + "成功比率:" + ((float)_intCorrects / (_intCorrects + _intErrors)).ToString());

                LogUtils.Info("========开始时间:" + opTime.ToString("yyyy-MM-dd HH:mm:ss.fff") + "结束时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "耗时:" + DateTime.Now.Subtract(opTime).TotalSeconds + "毫秒\n");
            }
            #endregion
        }

        //TravelAgent
        private void TravelAgentSearch(object obj)
        {
            List<string> list = obj as List<string>;
            TravelAgentService.TravelAgentServiceSoapClient client = new TravelAgentService.TravelAgentServiceSoapClient();
            TravelAgentService.SearchRequest model = new TravelAgentService.SearchRequest();
            model.cid = "cid";
            model.tripType = list[0];
            model.fromCity = list[1];
            model.toCity = list[2];
            model.fromDate = list[3];
            model.retDate = string.IsNullOrEmpty(list[4]) ? null : list[4];
            try
            {
                LogUtils.Info("请求参数:" + Newtonsoft.Json.JsonConvert.SerializeObject(model));
                TravelAgentService.SearchResult rsp = client.Search(model);
                lock (thisLock)
                {
                    _intCorrects++;
                }
                LogUtils.Info("响应数据:" + Newtonsoft.Json.JsonConvert.SerializeObject(rsp));
            }
            catch (Exception ex)
            {
                lock (thisLock)
                {
                    _intErrors++;
                    msgshow(string.Format("当前出错总次数:{0};", _intErrors.ToString()));
                    LogUtils.Info(string.Format("出错:{0};发送请求参数{1}", ex.Message, Newtonsoft.Json.JsonConvert.SerializeObject(model)));
                    LogUtils.Info(string.Format("当前出错总次数:{0};", _intErrors.ToString()));
                }
            }
        }

        //XinMinG
        private void XinMinGSearch(object obj)
        {
            List<string> list = obj as List<string>;
            XiMinGService.XiMinGServiceSoapClient client = new XiMinGService.XiMinGServiceSoapClient();
            XiMinGService.SearchRequest model = new XiMinGService.SearchRequest();
            model.UName = "UName";
            model.UPassword = "upwd";
            model.tripType = list[0];
            model.fromCity = list[1];
            model.toCity = list[2];
            model.fromDate = list[3];
            model.retDate = string.IsNullOrEmpty(list[4]) ? null : list[4];
            try
            {
                LogUtils.Info("请求参数:" + Newtonsoft.Json.JsonConvert.SerializeObject(model));
                XiMinGService.ListResponseOfT_PolicyModel rsp = client.Search(model);
                lock (thisLock)
                {
                    _intCorrects++;
                }
                LogUtils.Info("响应数据:" + Newtonsoft.Json.JsonConvert.SerializeObject(rsp));
            }
            catch (Exception ex)
            {
                lock (thisLock)
                {
                    _intErrors++;
                    LogUtils.Info(string.Format("出错:{0};发送请求参数{1}", ex.Message, Newtonsoft.Json.JsonConvert.SerializeObject(model)));
                    msgshow(string.Format("当前出错总次数:{0};", _intErrors.ToString()));
                    LogUtils.Info(string.Format("当前出错总次数:{0};", _intErrors.ToString()));
                }
            }
        }
    }
}

前台页面截图:

 

参考:

http://blog.sina.com.cn/s/blog_4dde37650100oh91.html

 

时间: 2024-08-28 07:10:14

多线程测试并发的相关文章

面试题_1_to_16_多线程、并发及线程的基础问题

多线程.并发及线程的基础问题 1)Java 中能创建 volatile 数组吗?能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引用指向的数组,将会受到 volatile 的保护,但是如果多个线程同时改变数组的元素,volatile 标示符就不能起到之前的保护作用了. 2)volatile 能使得一个非原子操作变成原子操作吗?一个典型的例子是在类中有一个 long 类型的成员变量.如果你知道该成员变量会被多个线程访问,如计数器

多线程的并发执行应用(生产者消费者模式)

在实际的开发中我们为了提高CPU的利用率,也提高程序的执行效率,我们经常使用多线程进行对数据进行并发处理,下面我举一个多线程并发执行的实例,大致意思就是 一个简单的生产者消费者模式,二个线程进行存数据,一个线程进行取数据. import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class BlockingQueueTest { /** * @param a

[Java] 转:多线程 (并发)总结

一概念 二创建多线程方法 三线程常用方法不完整可以自己查阅JDK文档 四线程的生命周期与转换 五同步 六竞争者消费者 七线程池 八JDK 线程工具 线程基础: 1. 创建 2. 状态切换 3. sleep与wait的区别 前者使线程阻塞固定时间后进入Runnable状态,后者使用notify后可以处于可执行状态. 4. synchroized 与 Lock 区别 synchroized 可以针对当前对象.某变量设置相应的对象锁 lock 控制粒度更细,使用ReentrantLook.look()

Junit使用GroboUtils进行多线程测试

写过Junit单元测试的同学应该会有感觉,Junit本身是不支持普通的多线程测试的,这是因为Junit的底层实现上,是用System.exit退出用例执行的.JVM都终止了,在测试线程启动的其他线程自然也无法执行.JunitCore代码如下: /**       * Run the tests contained in the classes named in the <code>args</code>.       * If all tests run successfully,

SpringBoot实战实现分布式锁一之重现多线程高并发场景

实战前言:上篇博文我总体介绍了我这套视频课程:"SpringBoot实战实现分布式锁" 总体涉及的内容,从本篇文章开始,我将开始介绍其中涉及到的相关知识要点,感兴趣的小伙伴可以关注关注学习学习!!工欲善其事,必先利其器,介绍分布式锁使用的前因后果之前,得先想办法说清楚为啥需要分布式锁以及如何才需要将分布式锁搬上用场!!其中,该课程的学习链接:http://edu.51cto.com/course/15684.html感兴趣的童鞋可以前往观看学习!!! 实战概要:故而此文将介绍一下分布式

最常见的15个Java多线程,并发面试问题

例如,用于DMA交易的高容量和低延迟电子交易系统通常是并发的.大多数情况下,他们专注于微秒延迟,这就是为什么拥有如何有效地最小化延迟和提高吞吐量知识是如此重要. 这些是我最喜欢的关于Java的线程面试问题.我没有提供这些线程访谈问题的答案,但我会尽可能给你一个提示.我会更新帖子就详细的答案,就像我最近在Java中发布的10个Singleton面试问题一样. 15 Java Thread Interview Questions and answers 无论如何,这里是一些常见的Java多线程和并发

JAVA多线程和并发基础面试问答(转载)

原文链接:http://www.cnblogs.com/dolphin0520/p/3932934.html 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题. Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含

Linux下模拟多线程的并发并发shell脚本

分享一个在Linux下模拟多线程的并发脚本,使用这个脚本可以同时批量在定义数量的服务器上执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高非常多,在管理大批服务器时非常的实用.     以下脚本功能是通过scp(也可选rsync)向上千台服务器传更新包,脚本运行后同时在后台有50个scp进程向服务器传包.#!/bin/baship=`cat iplist.txt|grep -v "#"|awk '{print $1}'`   #过滤服务器IPdir='/usr/l

JAVA多线程和并发基础面试问答

原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注:非常赞同这个观点) Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环