兄弟,你太有恒心了,小弟佩服~~再帮你随便写点,你自己再改改吧~~ public struct Task { public int No; public int Current; public int Max; }readonly List<Task> _taskList = new List<Task>();private void DYZ() { Random ran = new Random(); for (int i = 0; i < 10; i++) { _taskList.Add(new Task { Current = 0, Max = ran.Next(10, 20), No = i }); } var list = new List<Thread>(); for (int j = 0; j < 5; j++) { var thread = new Thread(Run) { IsBackground = true }; thread.Start(_taskList[j]); list.Add(thread); } list.ForEach(x => x.Join()); for (int j = 5; j < 10; j++) { var thread = new Thread(Run) { IsBackground = true }; thread.Start(_taskList[j]); thread.Join(); } Console.WriteLine("it's over"); }private void Run(object args) { try { Task task = (Task)args; while (task.Current < task.Max) { task.Current++; Thread.Sleep(200); lock (_taskList) { Console.Clear(); _taskList[task.No] = task; _taskList.ForEach(x => Console.WriteLine("No:{0} current:{1} max:{2}", x.No, x.Current, x.Max)); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } }这个是5个线程先一起跑,都跑完了之后,后面一个接着一个跑,每个的线程的终止值设的随机数~~
以前用过个Semaphore,帮你改了下~~总共10个,5个先跑,当其中有跑完了的,后5个随机上~~细节没有多考虑,你自己改吧~~等放假,好无聊~~using System; using System.Collections.Generic; using System.Threading;namespace ConsoleApplication1 { class Program { private const int MaxRunNumber = 5; private static RunTask[] _runTasks; static readonly List<Task> TaskList = new List<Task>(); public static Semaphore Sp = new Semaphore(MaxRunNumber, MaxRunNumber); static void Main() { Random ran = new Random(); for (int i = 0; i < 10; i++) { TaskList.Add(new Task { Current = 0, Max = ran.Next(10, 30), No = i }); } _runTasks = new RunTask[MaxRunNumber]; for (int i = 0; i < MaxRunNumber; i++) _runTasks[i] = new RunTask(); foreach (var task in TaskList) { Thread user = new Thread(Run); user.Start(task); Thread.Sleep(10); } Console.ReadLine(); } static void Run(Object task) { Sp.WaitOne(); RunTask runTask = null; for (int i = 0; i < MaxRunNumber; i++) if (_runTasks[i].IsOccupied == false) { runTask = _runTasks[i]; break; } if (runTask != null) runTask.Use((Task)task); Sp.Release(); } class RunTask { public bool IsOccupied; public void Use(Task task) { IsOccupied = true; while (task.Current < task.Max) { task.Current++; Thread.Sleep(500); lock (TaskList) { Console.Clear(); TaskList[task.No] = task; TaskList.ForEach(x => Console.WriteLine("No:{0} current:{1} max:{2}", x.No, x.Current, x.Max)); } } IsOccupied = false; } } public struct Task { public int Current; public int Max; public int No; } } }
看一下这个,保证能明白。
再看一下这个博文,http://blog.csdn.net/u012999424/article/details/17963131
现在是只有s4在执行 我想让s1-s3同时执行 s4 s5等待其他执行完成 就是有3个任务同时执行 其他等待执行完成
{
for (int j = 0; j < m_pcb.Length; j++)
{
var thread = new Thread(Run) { IsBackground = true };
thread.Start(j);
}
}private void Run(object args)
{
try
{
int no = (int)args;
int index = 0;
while (index < 10)
{
Console.WriteLine("No:{0} index:{1}", no, index++);
Thread.Sleep(1000);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
而且你循环内部的循环也要放到外面独立循环,定义一个集合List<pcb>,将要开始服务的都添加进来,进行你循环内部的那个循环。finish的项目,从List中移除/// <summary>
/// 第一种方法
/// </summary>
/// <param name="m_pcb1"></param>
private void DYZ(ref pcb[] m_pcb)
{
Time(ref m_pcb); //数据输入函数
int n = 0; //保存小赖的服务的索引
for (int j = 0; j < m_pcb.Length; j++)
{
//你需要顶一个一个外层变量,表示时间变化,同时在函数中,取出这个时间到达的所有项,然后进行后续操作
n = RYRW(ref m_pcb);//这里只取到了最先执行的。。
int k = m_pcb[n].TimeServer; //服务时间
if (j != 0) //不是第一个来的
{
m_pcb[n].TimeBegin = TimeEnd;
TimeEnd += m_pcb[n].TimeServer;
m_pcb[n].TimeEnd = m_pcb[n].TimeBegin + m_pcb[n].TimeServer;
}
else if (j == 0)
{
m_pcb[n].TimeBegin = m_pcb[n].TimeComing;
m_pcb[n].TimeEnd = m_pcb[n].TimeComing + m_pcb[n].TimeServer;
TimeEnd = m_pcb[n].TimeEnd;
} m_pcb[n].TimeCycle = m_pcb[n].TimeEnd - m_pcb[n].TimeComing;
m_pcb[n].finish = true;
for (int i = 0; i < k; i++)
{
Thread.Sleep(500);
Console.Clear();
m_pcb[n].TimeServer--; //还需要的服务时间,循环一次,自减
display(m_pcb);
}
} }
模拟火车售票程序。
01. using System;
02. using System.Threading;
03. namespace Example9_10
04. {
05. class Example9_10
06. {
07. static void Main(string[] args)
08. {
09. TicketAgency ta = new TicketAgency();
10. Thread[] ts = new Thread[4];
11. for (int i = 0; i < 4; i++)
12. {
13. ts[i] = new Thread(new ThreadStart(ta.RandomSell));
14. ts[i].Name = "窗口" + i;
15. ts[i].Start();
16. }
17. Console.Read();
18. }
19. }
20. public class TicketAgency
21. {
22. private int m_num = 0;
23. private Random rand = new Random();
24. public void Sell()
25. {
26. lock(this)
27. {
28. if (m_num < 66)
29. {
30. int tmp = m_num + 1;
31. Thread.Sleep(1);
32. m_num = tmp;
33. Console.WriteLine("{0}:售出{1}号车票", Thread.CurrentThread. Name, tmp);
34. }
35. else
36. {
37. Console.WriteLine("{0}:车票已售罄", Thread. CurrentThread. Name);
38. }
39. }
40. }
41. public void RandomSell()
42. {
43. int time=rand.Next(20);
44. for(int i=0;i<20;i++)
45. {
46. Thread.Sleep(time);
47. this.Sell();
48. }
49. }
50. }
51. }
/// <summary>
/// 第一种方法
/// </summary>
/// <param name="m_pcb1"></param>
private void DYZ(ref pcb[] m_pcb)
{
Time(ref m_pcb); //数据输入函数
int n = 0; //保存小赖的服务的索引
for (int j = 0; j < m_pcb.Length; j++)
{
/* var thread = new Thread(Run) { IsBackground = true };
thread.Start(j);*/
n = RYRW(ref m_pcb);
int k = m_pcb[n].TimeServer; //服务时间
if(j != 0) //不是第一个来的
{
m_pcb[n].TimeBegin = TimeEnd;
TimeEnd += m_pcb[n].TimeServer;
m_pcb[n].TimeEnd = m_pcb[n].TimeBegin + m_pcb[n].TimeServer;
}
else if(j==0)
{
m_pcb[n].TimeBegin = m_pcb[n].TimeComing;
m_pcb[n].TimeEnd = m_pcb[n].TimeComing+m_pcb[n].TimeServer;
TimeEnd = m_pcb[n].TimeEnd;
} m_pcb[n].TimeCycle = m_pcb[n].TimeEnd - m_pcb[n].TimeComing; for (int i=0;i<k;i++)
{
Thread.Sleep(500);
Console.Clear();
m_pcb[n].TimeServer--; //还需要的服务时间,循环一次,自减
display(m_pcb);
}
m_pcb[n].finish = true;
}
}这里被我超同步化了 能不能把我给他解体用5个stread分别控制起来
public struct Task
{
public int No;
public int Current;
public int Max;
}readonly List<Task> _taskList = new List<Task>();private void DYZ()
{
Random ran = new Random();
for (int i = 0; i < 10; i++)
{
_taskList.Add(new Task { Current = 0, Max = ran.Next(10, 20), No = i });
}
var list = new List<Thread>();
for (int j = 0; j < 5; j++)
{
var thread = new Thread(Run) { IsBackground = true };
thread.Start(_taskList[j]);
list.Add(thread);
}
list.ForEach(x => x.Join());
for (int j = 5; j < 10; j++)
{
var thread = new Thread(Run) { IsBackground = true };
thread.Start(_taskList[j]);
thread.Join();
}
Console.WriteLine("it's over");
}private void Run(object args)
{
try
{
Task task = (Task)args;
while (task.Current < task.Max)
{
task.Current++;
Thread.Sleep(200);
lock (_taskList)
{
Console.Clear();
_taskList[task.No] = task;
_taskList.ForEach(x => Console.WriteLine("No:{0} current:{1} max:{2}", x.No, x.Current, x.Max));
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}这个是5个线程先一起跑,都跑完了之后,后面一个接着一个跑,每个的线程的终止值设的随机数~~
using System.Collections.Generic;
using System.Threading;namespace ConsoleApplication1
{
class Program
{
private const int MaxRunNumber = 5;
private static RunTask[] _runTasks;
static readonly List<Task> TaskList = new List<Task>();
public static Semaphore Sp = new Semaphore(MaxRunNumber, MaxRunNumber); static void Main()
{
Random ran = new Random();
for (int i = 0; i < 10; i++)
{
TaskList.Add(new Task { Current = 0, Max = ran.Next(10, 30), No = i });
} _runTasks = new RunTask[MaxRunNumber];
for (int i = 0; i < MaxRunNumber; i++)
_runTasks[i] = new RunTask(); foreach (var task in TaskList)
{
Thread user = new Thread(Run);
user.Start(task);
Thread.Sleep(10);
}
Console.ReadLine();
} static void Run(Object task)
{
Sp.WaitOne();
RunTask runTask = null;
for (int i = 0; i < MaxRunNumber; i++)
if (_runTasks[i].IsOccupied == false)
{
runTask = _runTasks[i];
break;
}
if (runTask != null) runTask.Use((Task)task);
Sp.Release();
} class RunTask
{
public bool IsOccupied;
public void Use(Task task)
{
IsOccupied = true;
while (task.Current < task.Max)
{
task.Current++;
Thread.Sleep(500);
lock (TaskList)
{
Console.Clear();
TaskList[task.No] = task;
TaskList.ForEach(x => Console.WriteLine("No:{0} current:{1} max:{2}", x.No, x.Current, x.Max));
}
}
IsOccupied = false;
}
} public struct Task
{
public int Current;
public int Max;
public int No;
}
}
}
你所谓的第二种有什么区别么?你的意思是前面的完成了,要在页面显示上删掉,然后把后面那个显示到之前那个被删掉的位置上,仅仅就是为了让你能看出后面的是“插”到前面来了?
差不多 不过是这样的 s1 s2 s3 这样的任务 s2完成了 就变成s1 s3 s2 当然s2 位置上的时间也要变成s3的