我试图做一个简单的程序,执行以下操作:主题似乎从来没有得到一个机会,除非我有一个断点
我有两台起重机是采取关闭集装箱船。他们把集装箱放在码头上,2/3的卡车在那里接货。起重机可以在码头最多放置5个集装箱。
问题如下:当我没有断点时,起重机线程只是挑选容器并将它们放到码头上,然后程序停止。这是每次输出:
Kraan 2 heeft container nummer 1 van het schip gehaald.
Kraan 2 heeft container nummer 1 op de kade geplaatst.
Kraan 1 heeft container nummer 2 van het schip gehaald.
Kraan 1 heeft container nummer 2 op de kade geplaatst.
Kraan 2 heeft container nummer 3 van het schip gehaald.
Kraan 1 heeft container nummer 4 van het schip gehaald.
Kraan 2 heeft container nummer 3 op de kade geplaatst.
Kraan 2 heeft container nummer 5 van het schip gehaald.
Kraan 2 heeft container nummer 5 op de kade geplaatst.
Kraan 1 heeft container nummer 4 op de kade geplaatst.
Kraan 2 heeft container nummer 6 van het schip gehaald.
Kraan 1 heeft container nummer 7 van het schip gehaald.
因此,卡车线程不运行。当我在Wagen.VoerWerkzaamhedenUit()中放置一个断点时,断点确实受到撞击,奇迹般地运行整个程序,直到所有容器都被处理完。
这里是我的代码:
class Program
{
static void Main(string[] args)
{
for (int i = 1; i <= 100; i++)
{
Schip.LaadContainerOpSchip(i);
}
Thread kraan1 = new Thread(new Kraan().VoerWerkzaamhedenUit);
kraan1.Name = "Kraan 1";
kraan1.Start();
Thread kraan2 = new Thread(new Kraan().VoerWerkzaamhedenUit);
kraan2.Name = "Kraan 2";
kraan2.Start();
Thread wagen1 = new Thread(new Wagen().VoerWerkzaamhedenUit);
wagen1.Name = "Wagen 1";
wagen1.Start();
Thread wagen2 = new Thread(new Wagen().VoerWerkzaamhedenUit);
wagen2.Name = "Wagen 2";
wagen2.Start();
kraan1.Join();
kraan2.Join();
wagen1.Join();
wagen2.Join();
Console.WriteLine("Press any key to continue...");
Console.Read();
}
}
public class Kraan
{
private Random random = new Random();
public void VoerWerkzaamhedenUit()
{
while (Schip.HeeftContainers())
{
Thread.Sleep(random.Next(1000, 6000));
int container = Schip.VerwijderContainer();
if (container != -1)
{
Console.WriteLine("{0} heeft container nummer {1} van het schip gehaald.", Thread.CurrentThread.Name, container);
Thread.Sleep(random.Next(1000, 6000));
Kade.PlaatsContainer(container);
Console.WriteLine("{0} heeft container nummer {1} op de kade geplaatst.", Thread.CurrentThread.Name, container);
}
}
}
}
public static class Schip
{
private static List<int> containers = new List<int>();
public static void LaadContainerOpSchip(int container)
{
containers.Add(container);
}
public static int VerwijderContainer()
{
lock (containers)
{
int container = -1;
if (containers.Any())
{
container = containers[0];
containers.RemoveAt(0);
}
return container;
}
}
public static bool HeeftContainers()
{
lock (containers)
{
return containers.Any();
}
}
}
public static class Kade
{
private static List<int> containers = new List<int>();
public static void PlaatsContainer(int container)
{
lock (containers)
{
while (containers.Count == 5)
{
Monitor.Wait(containers);
}
containers.Add(container);
Monitor.PulseAll(containers);
}
}
public static int VerwijderContainer()
{
lock (containers)
{
while (containers.Count == 0)
{
Monitor.Wait(containers);
}
int container = -1;
if (containers.Any())
{
container = containers[0];
containers.RemoveAt(0);
}
Monitor.PulseAll(containers);
return container;
}
}
public static bool HeeftContainers()
{
lock (containers)
{
return containers.Any();
}
}
}
public class Wagen
{
private Random random = new Random();
public void VoerWerkzaamhedenUit()
{
while (Kade.HeeftContainers())
{
Thread.Sleep(random.Next(1000, 6000));
int container = Kade.VerwijderContainer();
if (container != -1)
{
Console.WriteLine("{0} heeft container nummer {1} van de kade gehaald.", Thread.CurrentThread.Name, container);
Thread.Sleep(random.Next(1000, 6000));
}
}
}
}
不,我不希望使用阻塞集合,我想用一个List<int>
;-)
你必须住在鹿特丹。问题在于,当kade空着时,工资司机起飞,永不回来。你需要一个更好的退出条件,比如在卡德和船空的时候返回。当凯德有一个容器时,司机也很难入睡。 –
是的,你是对的,我是从那里。我想我会看到你有更好的退出条件,这也是Eren所说的。我需要更好地看看你的司机睡着的提示,但... –