我开始学习线程并遇到问题。
我有一个评分系统,旨在为临时的addedPoints变量添加一个点,以向玩家显示他们最近获得的积分数。然后在大约1秒钟之后,应该将增加的分数添加到球员得分中。
我的尝试看起来像这样:
public static void AddPoints(int points)
{
for (int i = 0; i < points; i++)
{
Thread addThread = new Thread(new ThreadStart(ThreadedPoint));
}
}
private static void ThreadedPoint()
{
addedPoints += 1;
Thread.Sleep(1000);
score += 1;
addedPoints -= 1;
}
这有两个问题。首先它只允许我为每个线程添加1点,这远非理想。其次,它实际上并不起作用。添加的积分和分数都没有更新。我该如何解决这个问题?
答案 0 :(得分:8)
你还没有真正开始你的线程,所以什么都不会发生:
public static void AddPoints(int points)
{
for (int i = 0; i < points; i++)
{
Thread addThread = new Thread(new ThreadStart(ThreadedPoint));
addThread.Start();
}
}
在一次添加多个点而不是一次添加多个点时,您可以改为使用ParameterizedThreadStart:
public static void AddPoints(int points)
{
Thread addThread = new Thread(new ParameterizedThreadStart(ThreadedPoint));
addThread.Start(points); //You may need a cast of points to Object here
}
private static void ThreadedPoint(Object data)
{
int points = (int)data;
addedPoints += points;
Thread.Sleep(1000);
score += points;
addedPoints -= points;
}
答案 1 :(得分:2)
除非您想学习线程,否则最好重新设计您的商店“最近赚取”的方式,使其不需要延迟更新。
即。立即更新分数并有单独的文件,说明何时获得最新分数,因此您可以随时获得分数并使用一些代码找出“最近获得”的信息。如果需要,您可以通过“最近获得”来调整分数的显示值。
答案 2 :(得分:0)
如果你想慢慢消耗这些点,将点传递给线程(参见How can I pass a parameter to a Java Thread?)并使用while循环消耗所有点(假设你将传递的参数存储为点)。
while(points > 0) {
points -=1;
addedPoints += 1;
Thread.Sleep(1000);
score += 1;
addedPoints -= 1;
}