问个多线程问题

deknight 2017-04-24 08:05:56
假设我启动3个线程
for(int i=0;i<3;i++)
Thread test = new Thread(new ThreadStart(a.start));

public void start()
{
console.write(datetime.now);
}

每个线程都打印当前时间,但是,我需要让3个线程在不同的时间工作,而不是启动线程后全都直接打印时间,我该如何做呢?
难道要在start方法中,随机sleep x秒?
...全文
406 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你这不启线程可以解决的问题,非要启线程
yidaimu 2017-04-24
  • 打赏
  • 举报
回复
我觉得这个问题就是随机Sleep啊 模拟人思考的时间,网络传输的时间...
xuzuning 2017-04-24
  • 打赏
  • 举报
回复
对!随机sleep x秒 Sleep 并不是什么大逆不道的事情 存在就有存在的必要性
deknight 2017-04-24
  • 打赏
  • 举报
回复
如果不用sleep的话,我需要该如何处理呢?因为虽然是假人,但是要用实际的角色去看,也就是假人之间肯定是没有联系的,所以肯定也不能阻塞,他们都是独立的。
大然然 2017-04-24
  • 打赏
  • 举报
回复
如果非要用sleep,那就10个假人生成10个随机int ,让他们各自sleep不同的时间不就行了吗?
deknight 2017-04-24
  • 打赏
  • 举报
回复
几位版主好,其实是这样的,有个游戏,我写了个假人服务,比如我生成10个假人,我会遍历这10个假人,然后执行登陆,验证,等等一系列的操作,最后会让假人执行一个行走的命令,每个假人,我都是一个独立的线程去执行,现在程序写完后,发现在执行行走命令时,会同时开始,这样看起来假人就真的很假了,所以我想让假人的行走,不同时进行,也就有了该问题,如果我在线程中随机的sleep x秒,是可以达到我要的效果,但是我总觉得不是很好,请各位解惑。 另外我不明白,线程怎么就高大上了呢?你可以看不起我的问题,也可以不回答,我只是在虚心的请教问题而已。
正怒月神 2017-04-24
  • 打赏
  • 举报
回复
你这个是定时器timer干的事情。
  • 打赏
  • 举报
回复
你是要互斥执行?
by_封爱 版主 2017-04-24
  • 打赏
  • 举报
回复
你应该明确的说出来 你有什么需求. 而不是上来就::"线程" 这种 "高大上"的词语....
exception92 2017-04-24
  • 打赏
  • 举报
回复
那就不要new ThreadStart,而是类似这样:

 var thread = new Thread(() =>
            {
                // TODO:
               Thread.Sleep(不同的时间值)
            });
在某个方法或者事件中调用:
 thread.Start();
当然 这不是很好的方式。
  • 打赏
  • 举报
回复
没事儿乱“启动线程”干什么? 你应该基于定时器(System.Threading.Timer)来设计程序。
angel6709 2017-04-24
  • 打赏
  • 举报
回复
引用 6 楼 deknight 的回复:
几位版主好,其实是这样的,有个游戏,我写了个假人服务,比如我生成10个假人,我会遍历这10个假人,然后执行登陆,验证,等等一系列的操作,最后会让假人执行一个行走的命令,每个假人,我都是一个独立的线程去执行,现在程序写完后,发现在执行行走命令时,会同时开始,这样看起来假人就真的很假了,所以我想让假人的行走,不同时进行,也就有了该问题,如果我在线程中随机的sleep x秒,是可以达到我要的效果,但是我总觉得不是很好,请各位解惑。 另外我不明白,线程怎么就高大上了呢?你可以看不起我的问题,也可以不回答,我只是在虚心的请教问题而已。
你需要随机sleep x秒,用线程没问题。
zuopi8070 2017-04-24
  • 打赏
  • 举报
回复
多线程就是在不同的时间去处理程序啊,问题在于显示的时间精度问题。想要实现楼主提出的功能,需要利用定时器中的开启线程就可以了,同一时间开多个线程延时只有ms量级
孤独的海啊 2017-04-24
  • 打赏
  • 举报
回复
引用 6 楼 deknight 的回复:
几位版主好,其实是这样的,有个游戏,我写了个假人服务,比如我生成10个假人,我会遍历这10个假人,然后执行登陆,验证,等等一系列的操作,最后会让假人执行一个行走的命令,每个假人,我都是一个独立的线程去执行,现在程序写完后,发现在执行行走命令时,会同时开始,这样看起来假人就真的很假了,所以我想让假人的行走,不同时进行,也就有了该问题,如果我在线程中随机的sleep x秒,是可以达到我要的效果,但是我总觉得不是很好,请各位解惑。 另外我不明白,线程怎么就高大上了呢?你可以看不起我的问题,也可以不回答,我只是在虚心的请教问题而已。
你这个问题,随机sleep就很好了,然后我赶脚你也可以timer一把,就timer一次。回掉函数里面写假人的执行步骤。 然后你如果用Winform的话 我更建议你用backgroudworker 这个东西就是为winform而生,而且具备一些通知界面更新进度啥的功能,真是超级好用。
deknight 2017-04-24
  • 打赏
  • 举报
回复
是的,很类似
打老虎zz 2017-04-24
  • 打赏
  • 举报
回复
   static Dictionary<int, Task> allTask = new Dictionary<int, Task>();
        static Random random = new Random();
       
        static void Main(string[] args)
        {
          
            for (int i = 1; i < 4; i++)
            {
                int itemi = 0;
                itemi = i;
                lock (allTask)
                {
                    allTask.Add(i, Task.Run(() =>
                    {
                        WalkStart(itemi);
                    }));

                }
            }
           
            Console.Read();
        }
        static async void WalkStart(int itemi)
        {
            try
            {
                int time = random.Next(500, 700);
                await Task.Delay(time);
                start(itemi);
            }
            catch (Exception ex)
            {

                Console.WriteLine("错误:" + ex);
            }
            finally
            {
                allTask[itemi].ContinueWith(obj =>
                {
                    WalkStart(itemi);
                });

            }      
        }
        public static void start(int itemi)
        {
            Console.WriteLine(itemi+"走:"+DateTime.Now);
        }
类似这样?

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧