0

我开始学习线程并且遇到了问题。

我有一个计分系统,旨在将一个点添加到一个临时的 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 个点,这远非理想。其次,它实际上不起作用。addedPoints 和 score 都不会更新。我怎样才能解决这个问题?

4

3 回答 3

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;
}
于 2012-04-24T20:00:34.257 回答
2

除非您想学习线程,否则最好以不需要延迟更新的方式重新设计商店“最近赚取”的方式。

即立即更新分数并有单独的文件说明获得最新积分的时间,因此您始终可以获得分数并通过一些代码找出“最近获得”信息。如果需要,您可以通过“最近获得”调整分数的显示值。

于 2012-04-24T20:21:42.637 回答
0

如果您想慢慢消耗积分,请将积分传递给线程(请参阅如何将参数传递给 Java 线程?)并使用 while 循环消耗所有积分(假设您将传递的参数存储为积分) .

while(points > 0) {
  points -=1;
  addedPoints += 1;
  Thread.Sleep(1000);
  score += 1;
  addedPoints -= 1;
}
于 2012-04-24T20:05:34.523 回答