Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >同时运行多个线程,不运行两次或失败。

同时运行多个线程,不运行两次或失败。
EN

Stack Overflow用户
提问于 2013-10-11 11:20:23
回答 1查看 7.5K关注 0票数 5

如何在不“运行两次”或“失败”的情况下同时运行一些线程?我会以一个例子解释我的问题:

代码语言:javascript
运行
AI代码解释
复制
private int count = 0;
private HashSet<int> hs_pages = new HashSet<int>();

代码语言:javascript
运行
AI代码解释
复制
for (int page = 1; page <= 10; page++)
{
    Thread thread = new Thread(unused => my_method(page));
    thread.Name = "Thread - " + page.ToString();
    thread.Start();
}
while(count < 10)
{

}

并将my_method()实现为:

代码语言:javascript
运行
AI代码解释
复制
public void my_method(int page)
{
    if (hs_pages.Add(page))
    {    
           count++;
          //My Codes
    }
    else
    {
          MessageBox.Show("this is duplicate of page : " + page.ToString());
    }
}

在运行这段代码之后,我发现有些页面(1-10页)不运行,有些页面运行两次。

因此,while()永远不会因为这些重复和失败而结束。

我怎样才能修复那些重复和失败?

我对失败的意义不是“错误”,我的意思是,例如,my_method(4)从未运行过,而重复的意思是my_method(3)运行了两次。

我知道还有其他方法,如Parallel.ForEach,但我想学习如何使用线程类。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-11 11:22:54

你要关闭循环变量。

闭包关闭于变量,而不是值。您正在创建的lambda不是在循环主体中获取page当前值的副本,而是创建对该变量的引用,当匿名方法在将来的某个时候实际执行时,它将访问该变量的值。当执行实际发生时,循环已经继续并增加了一些次(我们不知道有多少次,这将取决于线程的调度方式)。

创建一个page的副本,该副本位于循环主体的局部,这样每个闭包都位于不同的变量上,而不是正在发生变异的单个变量:

代码语言:javascript
运行
AI代码解释
复制
for (int page = 1; page <= 10; page++)
{
    int pageCopy = page;
    Thread thread = new Thread(unused => my_method(pageCopy , count));
    thread.Name = "Thread - " + pageCopy.ToString();
    thread.Start();
}

而且,您不应该忙着等待所有线程完成;这极大地浪费了系统资源,在while循环中花费了大量的CPU时间。相反,在创建这些对象时,将创建的所有Thread对象放入一个List<Thread>中,然后在完成后再次遍历列表,然后调用它们上的Join等待它们完成。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19325669

复制
相关文章
Scrapy:多个爬虫同时运行
在spiders目录的同级目录下创建一个commands目录,并在该目录中创建一个crawlall.py,将scrapy源代码里的commands文件夹里的crawl.py源码复制过来,只修改run()方法即可。(文件夹下面必须要有__init__文件)
新码农
2020/12/29
1.5K0
Linux配置多个Tomcat同时运行
Linux系统下怎样配置多个Tomcat同时运行呢,首先修改变量为第一个tomcat,然后修改第二个tomcat启动的脚本
星哥玩云
2022/06/30
2.2K0
Linux系统中同时运行多个comcat
vi /etc/profile   在其中加入   ##########first tomcat###########   CATALINA_BASE=/usr/local/tomcat   CATALINA_HOME=/usr/local/tomcat   TOMCAT_HOME=/usr/local/tomcat   export CATALINA_BASE CATALINA_HOME TOMCAT_HOME   ##########first tomcat############   ##########second tomcat##########   CATALINA_2_BASE=/usr/local/tomcat_2   CATALINA_2_HOME=/usr/local/tomcat_2   TOMCAT_2_HOME=/usr/local/tomcat_2   export CATALINA_2_BASE CATALINA_2_HOME TOMCAT_2_HOME   ##########second tomcat##########   保存退出。   #source /etc/profile   来到第二个tomcat的bin目录下   在catalina.sh中加入   export CATALINA_BASE=$CATALINA_2_BASE   export CATALINA_HOME=$CATALINA_2_HOME   最后把tomcat_2/conf下的server.xml打开 修改shudown端口与启动端口。 <Server port="8005" shutdown="SHUTDOWN"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 这样就可以在linux下同时运行两个tomcat了。运行更多tomcat方法是一样的。 要点就是tomcat启动的时候会去查找tomat 的根目录,而这是通过查询系统环境变量CATALINA_HOME 以及 CATALINA_BASE 来做到的,于是我们只需要设置这两个变量即可。 现在我们把tomcat拷贝成2份,分别为 tomcat1 和 tomcat2,tomcat1 我们使用之前配置好的默认配置(CATALINA_HOME 以及 CATALINA_BASE 均指向 tomca1 目录),但tomcat2 我们不能再使用系统上配置的这两个变量了,那么我们就在 tomcat2的bin目录下面的 catalina.sh 临时修改设置 CATALINA_HOME 和 CATALINA_BASE 为tomcat2的根目录即可,如果再加tomcat 以此类推即可。
week
2018/08/24
1.8K0
tomcat不能运行或共存多个项目
我在Tomcat下部署了两个项目,但是一个可以运行,另一个不可以,第一感觉是内存问题,给tomcat多分配了内存.但是没有作用. 原因是少了webAppRootKey这个参数,需要在各自的web.xml下添加 <context-param>        <param-name>webAppRootKey</param-name>        <param-value>socialmedia</param-value>   </context-param> 但是我添加后,只能运行一个,其他两个运行不了。原
冷冷
2018/02/08
1K0
Python 异步: 同时运行多个协程(10)
asyncio 的一个好处是我们可以同时运行许多协程。这些协同程序可以在一个组中创建并存储,然后同时一起执行。这可以使用 asyncio.gather() 函数来实现。
数据科学工厂
2023/02/19
1.1K0
Python 异步: 同时运行多个协程(10)
asyncio 的一个好处是我们可以同时运行许多协程。这些协同程序可以在一个组中创建并存储,然后同时一起执行。这可以使用 asyncio.gather() 函数来实现。
数据科学工厂
2023/02/27
1.7K0
Python 异步: 同时运行多个协程(10)
MPI 本地局域网运行多机配置,同时运行多个程序;
在使用MPI框架中,需要多机进行通信进行并行计算;现在配置多个主机进行运行mpi程序,并进行通信;涉及到ssh无密码和nfs文件系统配置;
西湖醋鱼
2020/12/30
2.2K0
如何同时运行多个React Native、8081端口占用问题
当我们运行一个React Native项目的时候,React Native会启动一个默认端口号为8081的本地服务,该8081的服务就是React Native项目的一个本地服务器,用于提供JSBundle包和一些静态资源。这一切都是React Native帮开发者配置好的,一切都是那么简便,但如果出现如下几种情况,那么你需要认真阅读本文了:
conanma
2021/11/02
2.7K0
sklearn同时运行多个模型并进行可视化
参考:https://blog.csdn.net/qq_34106574/article/details/82016442
西西嘛呦
2020/08/26
9660
sklearn同时运行多个模型并进行可视化
Hadoop 任务运行失败
任务运行失败最常见的情况是 map 任务或 reduce 任务中的用户代码抛出运行异常。如果发生这种情况,任务 JVM 会在退出之前向其父 application master 发送错误报错。错误报告最后被记入用户日志中。application master 会将此次任务尝试标记为 failed (失败),并释放容器以便资源可以为其他任务使用。
smartsi
2019/08/07
3K0
一个Scrapy项目下的多个爬虫如何同时运行?
此时,这个命令行窗口在爬虫结束之前,会一直有数据流动,无法再输入新的命令。如果要运行另一个爬虫,必须另外开一个命令行窗口。
青南
2020/07/16
2.7K0
如何在一个Docker中同时运行多个程序进程?
那么基本思路是在Dockerfile 的CMD 或者 ENTRYPOINT 运行一个”东西”,然后再让这个”东西”运行多个其他进程 简单说来是用Bash Shell脚本或者三方进程守护 (Monit,Skaware S6,Supervisor),其他没讲到的三方进程守护工具同理
sunsky
2020/08/20
16.3K0
pycharm不联网能运行吗_pycharm连接调试器失败
第一步:查看你的计算机是否安装了严密的防火墙,当你开始运行编写的网络程序时他都会发出警告并且禁止你的程序连接网络你要对防火墙进行配置,让他允许你的程序或者直接关闭防火墙(慎重考虑)如下图
全栈程序员站长
2022/09/27
1.8K0
pycharm不联网能运行吗_pycharm连接调试器失败
linux 下运行多个tomcat
export CATALINA_BASE CATALINA_HOME TOMCAT_HOME
流柯
2018/08/30
4.4K0
android UiAutomator让运行失败的用例重新运行
本人在使用android UiAutomator做测试的时候,发现经常会因为页面加载太慢或者网络延迟比较大又或者出现意外情况导致用例失败,但是在检查的时候又能运行成功,提出了一个让失败的用例重新运行的需求,经过尝试终于成功了,使用excel作为测试报告的类型,html的类似,下面分享一下运行的代码,供大家参考。
FunTester
2019/09/04
8730
批量运行多个R脚本
如果把这些R代码文件一个个打开,然后一个个运行,工作量也不小,所以我们推荐一个技巧:
生信技能树
2022/07/26
1.9K0
批量运行多个R脚本
多线程是同时执行多个线程的吗
相信多线程各位大佬都用过,不管是在单核cpu还是多核cpu上都可以执行,但是多线程是同时执行多个线程的吗?
余生大大
2022/11/02
1.1K0
【分享】并行或串行运行多个NPM脚本的CLI工具
Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~ 背景介绍: 我们的node项目的脚本通通都是放在了package.json的scripts节点下面,当我们要在一个命令执行完后接着去执行下一个命令的时候(如:打包后需要推送打包内容到服务器)就需要增加一条脚本并使用&amp;&amp;进行拼接两条或多条命令来实现,并且符号&amp;在windows下的cmd.exe是不兼容的。 本期介绍的主角(npm-run-all): 今天主要想分享一个比较不错的N
前端小鑫同学
2022/12/26
1.5K0
【分享】并行或串行运行多个NPM脚本的CLI工具
批量运行多个R脚本并打印运行状态
曾老师曾经有一篇推文《批量运行多个R脚本》,介绍了批量运行R脚本的思路,同时也提出了一些问题,今天就这个学徒作业,我们来探究一下。
小汪Waud
2023/02/20
9380
批量运行多个R脚本并打印运行状态
线程创建和运行
有2种方法: 1.继承Thread类 2.实现Runnable接口 创建线程一(继承Thread类): public class ThreadTest1 extends Thread{ public void run(){ System.out.println("线程1"); } } 创建线程二(继承Thread类): public class ThreadTest2 extends Thread{ public void run(){ System
MonroeCode
2018/02/09
7880

相似问题

同时运行多个线程,然后运行主线程。

42

同时运行多个线程

13

同时运行多个函数(线程)

110

线程同时运行

30

同时运行多个线程,但逐个打印?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文