关于多线程问题(新开启的线程里面再开启线程)

问题描述

先说下流程:首先运行主方法MainFun()这个方法会开启5个线程,每个线程调用DoSomething这方法,在DoSomething这个方法里面又会再开启线程(可能会开启多个),然后分别调用A、B、C、D、E5个方法。现在的问题是,我测试的时候,我用一个按钮的单击事件调用MainFun(),发现有时候程序会崩溃(什么错都不报直接关闭了),有时候正常运行,如果我按钮点快了是100%程序会崩溃的。求解决,多线程不会,改怎么解决,还是我写的有问题?主要代码如下:privatevoidMainFun(){string[]chanArr=newstring[]{"A","B","C","D","E"};for(inti=0;i<chanArr.Length;i++){Threadth=newThread(newParameterizedThreadStart(DoSomething));th.Start(chanArr[i]);}}privatevoidDoSomething(objectnodeName){List<Dictionary<string,string>>list=newList<Dictionary<string,string>>();list=ReadFromXml(nodeName.ToString());if(list.Count<=0)return;for(inti=0;i<list.Count;i++){stringchanId=list[i]["ChanId"];stringparam=list[i]["param"];ParameterizedThreadStartpts=null;if(chanId=="9")pts=newParameterizedThreadStart(A);if(chanId=="521")pts=newParameterizedThreadStart(B);if(chanId=="525")pts=newParameterizedThreadStart(C);if(chanId=="526")pts=newParameterizedThreadStart(D);if(chanId=="532")pts=newParameterizedThreadStart(E);Threadth=newThread(pts);th.Start(param);}}privatevoidA(objectparam){}privatevoidB(objectparam){}privatevoidC(objectparam){}privatevoidD(objectparam){}privatevoidE(objectparam){}

解决方案

解决方案二:
大神们呢,求解答!
解决方案三:
把每个函数都加上try{}catch(Exception){Console.WriteLine(ex.messge);}然后在每句Console.WriteLine(ex.messge);设置断点,看看到底是什么原因报错
解决方案四:
for(inti=0;i<list.Count;i++){stringchanId=list[i]["ChanId"];stringparam=list[i]["param"];ParameterizedThreadStartpts=null;if(chanId=="9")pts=newParameterizedThreadStart(A);if(chanId=="521")pts=newParameterizedThreadStart(B);if(chanId=="525")pts=newParameterizedThreadStart(C);if(chanId=="526")pts=newParameterizedThreadStart(D);if(chanId=="532")pts=newParameterizedThreadStart(E);Threadth=newThread(pts);th.Start(param);}如果pts没赋值怎么办?代码我没测试,不过很可能是这个问题。也可能是每次都开线程,资源耗完了。
解决方案五:
引用3楼kenfinal的回复:

for(inti=0;i<list.Count;i++){stringchanId=list[i]["ChanId"];stringparam=list[i]["param"];ParameterizedThreadStartpts=null;if(chanId=="9")pts=newParameterizedThreadStart(A);if(chanId=="521")pts=newParameterizedThreadStart(B);if(chanId=="525")pts=newParameterizedThreadStart(C);if(chanId=="526")pts=newParameterizedThreadStart(D);if(chanId=="532")pts=newParameterizedThreadStart(E);Threadth=newThread(pts);th.Start(param);}如果pts没赋值怎么办?代码我没测试,不过很可能是这个问题。也可能是每次都开线程,资源耗完了。

pts没赋值可能会报错,我开始可能没考虑这个问题,但是我的chanid是从XML里面读出来的,是100%会有值的,因为值是固定的只有那几种可能。我在想是不是你说的资源耗尽。如果想解决这个问题就是一个线程执行完了不用了就关闭是吧,但是现在问题来了:我开启一个线程后会进入下一个方法,在下一个方法里面我如何判断这个线程是不是执行完了呢,也就是说我在下一个方法里面不能调用开启线程的那个变量啊,如果定义成全局的,我是通过一个变量来开启多个的,那又如何判断是某一个方法里的某一个线程执行完了呢?
解决方案六:
引用2楼human_2000的回复:

把每个函数都加上try{}catch(Exception){Console.WriteLine(ex.messge);}然后在每句Console.WriteLine(ex.messge);设置断点,看看到底是什么原因报错

好像,有点道理我试试!
解决方案七:
引用2楼human_2000的回复:

把每个函数都加上try{}catch(Exception){Console.WriteLine(ex.messge);}然后在每句Console.WriteLine(ex.messge);设置断点,看看到底是什么原因报错

事实证明不行,点了按钮之后程序没任何报错直接就关闭了。就行正常的关闭程序一样!
解决方案八:
不可能,你把开发工具的”输出“打开看看,正常退出和异常退出肯定有区别的
解决方案九:
加上日志输出吧,或者用messagebox把catch里的东西show出来看看。我能告诉你的是,线程开多了程序不会直接崩溃退出,线程多了顶多是新开的线程不会运行,会处于等待状态,等有线程结束了,才会运行
解决方案十:
检查你多线程操作内部是否有UI(界面)的操作,是否都委托回调了。对于公共列表操作是否有安全性的锁定。你给的显然不是实际代码,问题部分已经被你隐藏掉了,仅开启线程并执行空方法,100%不会出错。

时间: 2024-10-22 18:29:11

关于多线程问题(新开启的线程里面再开启线程)的相关文章

Linux多线程 创造新线程 线程的生命周期

创造新线程 一.线程的ID pthread_t:结构体(FreeBSD5.2.Mac OS10.3)/unsigned long int(linux)                /usr/include/bits/pthreadtypes.h 获取线程ID:pthread_self() 一个实例:获取主线程ID #include "apue.h" int main(){    pid_t pid;    pthread_t tid;     pid = getpid();    t

C# 多线程问题,使用for循环产生多个线程执行相同的操作

问题描述 如下面的代码publicvoidbtnRead(){for(inti=0;i<10;i++){ThreadthreadReadData=newThread(newParameterizedThreadStart(delegate(objectobj){ReadData(i);}));threadReadData.IsBackground=true;threadReadData.Start(i);}}privatevoidReadData(objectobj){while(true){s

JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口

JAVA之旅(十二)--Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口 开始挑战一些难度了,线程和I/O方面的操作了,继续坚持 一.Thread 如何在自定义的代码中,自定义一个线程呢? 我们查看API文档,我们要启动一个线程,先实现一个子类, package com.lgl.hellojava; public class MyThread extends Thread { @Override public void run()

Java多线程:“基础篇”10之线程优先级和守护线程

1. 线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5."高优先级线程"会优先于 "低优先级线程"执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon()方法来区别它们:如果返回false, 则说明该线程是"用户线程":否则就是"守护线程". 用户线程一般用户执 行用户级任务,而守护线程也就是"后台线程",一般用来执行后台任务.需要注意的是: Java虚拟

多线程-使用多个线程池还是一个线程池

问题描述 使用多个线程池还是一个线程池 最近在技术理论上遇到一个问题,不知道怎么解决. 问题描述:我们交易平台有4个商品(A.B.C.D)需要进行现在交易,交易的核心方法dealorder是 一个加了锁和事务的方法,而且该类是针对每一个商品的,即最多同时可以执行4个dealOrder方法,即每个商品执行一个该方法. @Transactional public synchronized Message dealOrder() CPU核心数是固定的,假如为6核心,目前就存在一个问题, 情况1:假如说

多线程-创建线程过多会出现线程不执行问题?

问题描述 创建线程过多会出现线程不执行问题? #include "stdafx.h" #include #include #include #include using namespace std; DWORD CALLBACK ThreadFun_02(LPVOID lp); bool PrintLog(const char * pString); CRITICAL_SECTION g_Cs; int g_iTickets = 20; int main() { InitializeC

多线程-疑问:线程启动之后再设置线程的优先级别,逻辑上是不是有问题?

问题描述 疑问:线程启动之后再设置线程的优先级别,逻辑上是不是有问题? 正在学习多线程,有这样一个疑问:线程启动之后再设置线程的优先级别,逻辑上是不是有问题?求助大神们解答下. 解决方案 没啥问题,相当于动态调整线程优先级.因为线程优先级是影响CPU调度优先级,你修改了,就可以影响下一次CPU的选择.所以可以启动再修改. 解决方案二: 没有问题,但是要注意,如果你启动的时候创建的是实时优先级,那么可能更改优先级的代码得不到及时执行. 解决方案三: 现代操作系统都是多任务抢占式操作系统,系统会随时

Java基础-23总结多线程,线程实现Runnable接口,线程名字获取和设置,线程控制,线程安全,同步线程

你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:多线程(理解) (1)多线程:一个应用程序有多条执行路径 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 多进程的意义? 提高

谁有多线程代码!!我想实现10个线程同时执行一个方法!

问题描述 我想10个线程同时执行一个方法,但是每个方法传入的参数是不一样的!我在网上找了些代码,但是不行,造成线程混乱,谁能教教我啊!!想要实现的是:10个线程同时去登陆网站,然后采集东西.当然我也有10个用户名.10个线程每个线程对应一个用户. 解决方案 解决方案二:分太少了.不然老夫贴出来解决方案三:ThreadPool.QueueUserWorkItem();解决方案四:给你个多线程的例子privatevoidbtnDataUp_Click(objectsender,RoutedEvent