多线程重复运行的如何防止线程重复运行

问题描述

我的代码如下,我的思路是读出TXT文件的内容,然后组合成新的内容,因为数量少,所以设置了10个线程,运行完一次,后面的线程还会继续运行,造成重复!刚学使用多线程,请问大侠这怎么解决,如果方便的话贴下代码最好了,感谢!!!usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;usingSystem.Threading;namespace多线程操作2015_1_28{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;}privatevoidbutton1_Click(objectsender,EventArgse){//获取文件路径GetPath();//判断是否有选择文件if(chang){ReadText();System.Threading.Threadt=newSystem.Threading.Thread(startthread);t.IsBackground=true;t.Start();//GetKeyword()}}voidstartthread(){for(inti=0;i<xianchengshu.Value;i++){System.Threading.Threadt=newSystem.Threading.Thread(GetKeyword);t.Name="我是第"+i+"个线程";t.IsBackground=true;System.Threading.Thread.Sleep(10000);t.Start();}}//定义文件目录接受路径变量publicstaticstringpath;//读文本接受变量publicstaticStreamReaderstr;staticintnum=0;staticintnum2=0;staticboolchang=false;//存放关键词的LIST集合List<string>keywords=newList<string>();///<summary>///获取目录文件的路径///</summary>///<returns></returns>///publicvoidGetKeyword(){lock(this){for(inti=0;i<keywords.Count;i++){for(intj=0;j<keywords.Count;j++){if(keywords[i]!=keywords[j]){textBox2.AppendText(keywords[i]+textBox3.Text.Trim()+keywords[j]+"rn");num++;label2.Text="组合后关键词("+num+")个";toolStripStatusLabel2.Text="正在组合关键词【"+keywords[i]+keywords[j]+"】";}}//keywords.RemoveAt(0);}}toolStripStatusLabel2.Text="关键词组合完成,共有【"+num2+"】个主词【"+num+"】个组合词";//while(true)//{//for(inti=1;i<keywords.Count;i++)//{//textBox2.AppendText(keywords[0]+keywords[i]+"rn");//}//}}publicvoidGetPath(){OpenFileDialogfile=newOpenFileDialog();file.Filter="文本文件(*.txt)|*.txt";if(file.ShowDialog()==DialogResult.OK){chang=true;stringpath=file.FileName;str=newStreamReader(path,Encoding.Default);}else{chang=false;MessageBox.Show("请选择文件名!");}//该函数要放在过滤后,否则不显示过滤文本!}//读取文本值,存放到TBoX和keywords集合中privatevoidReadText(){//toolStripStatusLabel1.Text=System.Threading.Thread.CurrentThread.Name+"【"+num+"】";线程数System.Threading.Thread.Sleep(1000);while(str.Peek()>0){stringstrs=str.ReadLine();if(strs!=null&strs!=""){textBox1.AppendText(strs+"rn");keywords.Add(strs);num2++;toolStripStatusLabel2.Text="正在加载关键词【"+strs+"】";}label1.Text="待组合关键词("+num2+")个";toolStripStatusLabel2.Text="线程启动中请等候……";}}privatevoidbutton2_Click(objectsender,EventArgse){SaveFileDialogsavefile=newSaveFileDialog();savefile.Filter="(文本文件)|*.txt";if(savefile.ShowDialog()==DialogResult.OK){StreamWriterstrw=newStreamWriter(savefile.FileName);strw.Write(textBox2.Text,true);strw.Flush();strw.Close();}}}}

解决方案

解决方案二:
你就组合一个text文本,用的着10个多线程么,,造成资源浪费。
解决方案三:
1.你应该先学习多线程怎么用,什么时候应该用,为了解决什么问题,而不是滥用多线程2.你这里根本没有任何地方需要用到多线程3.多线程重复执行完全是你逻辑问题,跟多线程还是单线程无关
解决方案四:
多线程也不过是并行执行逻辑你想多线程不重复执行你就得保证用单线程顺序执行的时候它不会重复执行
解决方案五:
引用3楼Z65443344的回复:

多线程也不过是并行执行逻辑你想多线程不重复执行你就得保证用单线程顺序执行的时候它不会重复执行

说的很对啊。不愧是大神
解决方案六:
比如一个搬砖的任务10个人从车上把砖搬下来,并且铺满地面那么你必须先给他们分工,要么每个人负责一个区域,只往自己的区域里放,不要堆到别人的地盘上去,那样就可能造成别人已经在那里放了砖,结果又放到了上面要么加锁控制,就是每块能放砖的地方一次只能一个人往上放,不能俩人同时放你把任务拆开,不让10个人同时干活,而让1个人干完活了才让其他人干,如果这样也都会造成砖头摞成摞,那10个人一起干就更要打架了
解决方案七:
引用5楼Z65443344的回复:

比如一个搬砖的任务10个人从车上把砖搬下来,并且铺满地面那么你必须先给他们分工,要么每个人负责一个区域,只往自己的区域里放,不要堆到别人的地盘上去,那样就可能造成别人已经在那里放了砖,结果又放到了上面要么加锁控制,就是每块能放砖的地方一次只能一个人往上放,不能俩人同时放你把任务拆开,不让10个人同时干活,而让1个人干完活了才让其他人干,如果这样也都会造成砖头摞成摞,那10个人一起干就更要打架了

等于10个人干一个活,而且当1个人干活的时候,其它人也想干,lock就好比"先等等,等我干玩",那么这样根本没必要多线程了.
解决方案八:
引用6楼xtdhb的回复:

等于10个人干一个活,而且当1个人干活的时候,其它人也想干,lock就好比"先等等,等我干玩",那么这样根本没必要多线程了.

所以lock不要lock整个过程,而只lock其中一个需要避免并发的过程比如搬砖的过程,从车到地,这完全是各搬各的,互不影响,没必要等别人搬完你才能搬而往地上放的时候,就必须排队,我先放,然后你再放,不能一起往一个地方放,那不乱套了要么就分配好了各放各的地方,不往一起放
解决方案九:
最费时的不过是搬的过程,这个过程一定要并发,否则一个人一趟一趟的太耗时了而"拿"和"放",耗时很短,却又需要避免并发不能两个人去抢一块砖,也不能两个人各拿一块砖往同一个地方放,那不撞一起了
解决方案十:
那么同样的,多线程执行逻辑的时候取值,赋值,耗时是最短的,但是要避免并发,要么把取值的数组和返回值的数组根据线程号分段,各干各的互不干扰要么就要在取值,赋值的时候加lock而取到值,拿这个值去计算,甚至通信,这个时间就长了,而且是多线程各干各的本来也不会互相影响

时间: 2024-10-27 18:33:54

多线程重复运行的如何防止线程重复运行的相关文章

《C++多线程编程实战》——.7 线程模型的实现

2.7 线程模型的实现 我们可以把进程看作是一个对象,它的任务就是把相关资源分组.每个进程都有一个地址空间,如图2.10所示. 图2.10 进程的地址空间 这个所谓的进程图像必须在初始化CreateProcess时加载至物理内存中.所有的资源(如文件句柄.子进程的信息.信号处理器等)都被储存起来.把它们以进程的形式分组在一起,更容易管理. 除进程外,还有一个重要的概念是线程.线程是CPU可执行调度的最小单位.也就是说,进程本身不能获得CPU时间,只有它的线程才可以.线程通过它的工作变量和栈来储存

c++-如何随时终止C++线程的运行?

问题描述 如何随时终止C++线程的运行? 需要用在工业控制方面. 由于几乎每一句代码都会控制外部设备的运动,所以为了使外部设备能够及时停止运动,操作时可能随时会终止线程的执行. 例如一个工作线程: t1(LPVOID lparam) { while( true ) { move(1); move(2); move(3); move(4); } return 0; } 当我单击停止按钮时,不论t1执行到4步中的哪一步,线程必须停止执行并退出而非等待线程完全执行完毕.停止的位置可能是第一步,可能是第

java 多线程方法加锁获取自增变量重复问题

问题描述 java 多线程方法加锁获取自增变量重复问题 /** 测试多线程并发获取唯一子增长的值 @author Administrator * */ public class BB { private int increment = 0; final static Set set = new HashSet(); final static List list = new ArrayList(); public synchronized int getauto() { return increm

iOS多线程的初步研究(四、五、六)--NSTimer--NSURLConnection子线程中运行 ---- NSOperation

iOS多线程的初步研究(四)-- NSTimer 理解run loop后,才能彻底理解NSTimer的实现原理,也就是说NSTimer实际上依赖run loop实现的. 先看看NSTimer的两个常用方法: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; //生成

当主线程崩溃而其它线程继续运行时发生什么

孤线程模式 症状 治疗和预防措施 总结 参考资料 关于作者 对本文的评价 当主线程崩溃而其它线程继续运行时发生什么? Eric E. Allen(eallen@cs.rice.edu) 博士研究生候选人,Rice 大学 2001 年 8 月 在多线程代码中,使用驱动其它线程所负责的动作的单个主线程是常见的.这个主线程发送消息,通常是通过把它们放到一个队列中,然后其它线程处理这些消息.但是如果主线程抛出一个异常,那么剩余的线程会继续运行,等待更多输入到该队列,导致程序冻结.在诊断 Java 代码的

c++-C++多线程问题,能不能套用线程?

问题描述 C++多线程问题,能不能套用线程? 主函数里为一个子函数开辟了一个线程,也就是说这个子函数单独用一个线程做,那在这个子函数里还能给别的开辟新的线程执行别的.cpp文件的函数吗?就是线程可以套着用吗?他们还是同时运行吗?第一次接触C++多线程还在看基础知识,麻烦高手给讲解一下,谢谢! 解决方案 在编程的时候将多线程认为是同时运行是没错的,如果你线程间有共享的数据那么还需要注意数据的同步. 解决方案二: 补充一下: 我这边已经建了一个线程处理一个函数1了,但是那个函数1里有一个很复杂的函数

[经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素

题目 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间. 思路一 寻找重复元素,很容易想到建立哈希表来完成,遍历一遍数组就可以将每个元素映射到哈希表中.如果哈希表中已经存在这个元素则说明这就是个重复元素.这种方法可以很方便的在O(n)时间内完成对重复元素的查找.可是题目要求在O(1)的空间.因此采用哈希表这种解法肯定在空间复杂度上是不符合要求的.题目中数组中所以数字都在[0, n-1]区间范围内,因此哈希表的大小为n

Java多线程:“基础篇”06之线程让步

1. yield()介绍 yield()的作用是让步.它能让当前线程由"运行状态"进入到"就绪状态",从而让其它具有相同优先级的等待线程获取执行权:但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权:也有可能是当前线程又进入到"运行状态"继续运行! 2. yield()示例 下面,通过示例查看它的用法. // YieldTest.java的源码 class ThreadA extends Thread{

android-在哪个线程中运行 AsyncTask?

问题描述 在哪个线程中运行 AsyncTask? 应用程序的 AlertDialog.Builder(context) 中有下面的代码.问题是在哪个线程中运行呢? final Thread myPrettyOperation = new Thread() { @Override public void run() { //Do some really long operation. } }; class MyPrettyTask extends AsyncTask<Void, Integer,