首页 新闻 赞助 找找看

线程Thread有什么用?感觉就是用了一计时器来回调动,顺序执行程序,没有并行同时运行代码?

0
悬赏园豆:5 [已解决问题] 解决于 2014-07-31 23:40

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace   线程测试
{
class MyInterrupt
{
public static Thread sleeper;
public static Thread awaker;
public void SleepThread()
{
for (int i = 1; i < 10; i++)
{
Console.Write(i + ",");
if (i == 4 || i == 8)
{
Console.WriteLine("Thread is sleep at" + i);
try
{
Thread.Sleep(20);//有点像Timer控件,掐时间跑程序而已,哪里体现两个线程的优点?
}
catch (ThreadInterruptedException e)
{
Console.WriteLine("Thread is interrupted"+"异常了!"+e.Message);
}

}
}
}
public void AwakeThread()
{

for(int i=10;i<20;i++)
{ Console.Write(i+",");
if(sleeper.ThreadState==System.Threading.ThreadState.WaitSleepJoin)
{
Console.WriteLine("Thread is awake at滚犊子"+i);
sleeper.Interrupt();
}
}
}
static void Main(string[] args)
{
MyInterrupt mi = new MyInterrupt();
sleeper = new Thread(new ThreadStart(mi.SleepThread));
awaker = new Thread(new ThreadStart(mi.AwakeThread));
sleeper.Start();//首先运行sleeper线程
awaker.Start();//第二个运行的awaker线程
Console.Read();
}

}
}

 

 

运行程序结果截图:

 

问题:

1,运行的结果,有时候不一样,是不是就是代码并行运行的结果,导致输出的结果可控性差?

2线程究竟是什么,感觉就是个函数而已,没什么特别,没有用,就像windowform窗体,没有关闭窗体而已?其实具体线程是什么,有什么用处?线程出现的历史原因?其实不用线程,用函数函数代替就行,还弄个线程干什么?

黑夜猫头鹰的主页 黑夜猫头鹰 | 初学一级 | 园豆:3
提问于:2014-07-31 17:58
< >
分享
最佳答案
0

对于单核来说,同一时刻,肯定是只能执行一段代码的。

多线程的作用在于让多段代码随机执行,就不用等待耗时长的代码执行完毕。可以优先执行后面的过程。

收获园豆:4
幻天芒 | 高人七级 |园豆:37175 | 2014-07-31 18:01

专家,我感觉,不用线程也可以,调用两个方法就算了,没多线程的威力体现在哪里?我的线程一个sleeper、一个是awaker;这里用两个线程,感觉用两个方法函数而已

黑夜猫头鹰 | 园豆:3 (初学一级) | 2014-07-31 18:12

@黑夜猫头鹰: 如果有一个方法很耗时,需要执行半小时怎么办?第二个方法是响应给客户的,难道客户需要等待半小时才能收到响应吗?

幻天芒 | 园豆:37175 (高人七级) | 2014-07-31 18:57

@幻天芒: 如果是winform的话,究竟有没有线程的?其实一个winform窗体,本质也是一个线程吗?因为假设我们有个项目,我们可以同时打开多窗体,如一个是学生表窗体,一个课程表窗体,他们之间可以同时进行的,请问其实这个两个窗体间的本质也是用了线程的技术,使得同个项目的两个窗体可以同时并行运行?

黑夜猫头鹰 | 园豆:3 (初学一级) | 2014-07-31 21:08

@黑夜猫头鹰: 对于一个WinForm程序来说,整个算一个线程,UI线程,控制所有的窗体,因为你不可能操作两个窗体,所以这里没有多线程哇。

幻天芒 | 园豆:37175 (高人七级) | 2014-07-31 21:11

@幻天芒: 接着我刚才的例子,我不是说,我的项目有两个窗体(一个学生表窗体,一个课程表winform窗体),我同时在两个窗体输入信息,两个窗体输入信息后,就上传信息到数据库,那么假设我的数据上传到数据库要半小时,那么我在那个窗体信息都输入完毕后,同时给在两个窗体点击“提交”按钮,这样不是起到同步上传的功能?相当于两个线程呢?

我的理解不对?

黑夜猫头鹰 | 园豆:3 (初学一级) | 2014-07-31 21:30

@黑夜猫头鹰: 虽然是两个窗体,你无法同时点提交。然后在数据上传到数据库的这半个小时,窗体是卡死的。这就是单线程的问题。如果是多线程的话,当你对窗体操作时,命令会进入执行队列,cpu可能一下子就把你的窗体操作执行了,然后接着上传数据库,这个时候,给用户的感觉,就是窗体是随时可操作的。

幻天芒 | 园豆:37175 (高人七级) | 2014-07-31 23:11

@幻天芒: 你是说,点击第一个“提交”按钮,第二个窗体的“提交”按钮是不能点击是吗?要等到第一个窗体的数据上传完毕后,第二窗体的“提交”按钮才可以是吧?

黑夜猫头鹰 | 园豆:3 (初学一级) | 2014-07-31 23:25

@黑夜猫头鹰: 单线程下,就是这样的~

幻天芒 | 园豆:37175 (高人七级) | 2014-07-31 23:36

@幻天芒: 多谢大牛

黑夜猫头鹰 | 园豆:3 (初学一级) | 2014-07-31 23:38

@黑夜猫头鹰: 我只是入门级的哈,你可以多实践下,体会更深。

幻天芒 | 园豆:37175 (高人七级) | 2014-07-31 23:39

@幻天芒: 带牛,其实我点不解即使,我不只是创建了两个线程怎么看管理器哪里是19个线程,求老师科普

黑夜猫头鹰 | 园豆:3 (初学一级) | 2014-08-01 09:16

@黑夜猫头鹰: 这个没注意过,解释不来~

幻天芒 | 园豆:37175 (高人七级) | 2014-08-01 19:54

@幻天芒: 老师,就喜欢开玩笑,能不能别这样……

黑夜猫头鹰 | 园豆:3 (初学一级) | 2014-08-01 21:16

@黑夜猫头鹰: 真心不会的。我搜索了下,说的是程序自己内部的。你可以测试下,自己新建多个线程,这边会不会多。

幻天芒 | 园豆:37175 (高人七级) | 2014-08-01 22:36
其他回答(2)
0

你看的这是别人的DEMO,就是在那儿演示怎么写Thread的代码。当然你不明白为什么要有线程了。

这么说吧,不用线程的话,你的UI就会卡死。比如你点下一个按钮,假设要做30分钟,不用线程的话,你那个软件就直接废了,

谁点都不响应。

收获园豆:1
爱编程的大叔 | 园豆:30839 (高人七级) | 2014-07-31 18:02

如果是winform的话,也没有多线程?其实一个线程好比是一个winform窗体而已,可在winform窗体根本没有使用线程;照你的例子,假设做UI的话,我用一个窗体做UI,其实要处理的是用另外一个窗体即刻,不用线程技术?请老师,指点

支持(0) 反对(0) 黑夜猫头鹰 | 园豆:3 (初学一级) | 2014-07-31 18:16
0

连青人``多县城的重点在于异步。你先弄明白什么是异步再说吧

吴瑞祥 | 园豆:29449 (高人七级) | 2014-07-31 18:19

异步,同步的反义词

支持(0) 反对(0) 黑夜猫头鹰 | 园豆:3 (初学一级) | 2014-07-31 18:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册