问题描述
我的代码如下,我的思路是读出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而取到值,拿这个值去计算,甚至通信,这个时间就长了,而且是多线程各干各的本来也不会互相影响