-1

我有这个程序有 3 个线程来显示数字 1-10。我希望它们按顺序输出,但目前它在跳来跳去。示例 0 1 2 3 4 5 6 7 8 9

我在论坛中环顾四周,它显示 Thread.yield(); 将解决这个问题,但在我输入 Thread.yield(); 它仍然一样

  public class ThreadTest
    {
   public static void main(String [] args)
   {
      MyThread t1 = new MyThread(0, 3, 10);
      MyThread t2 = new MyThread(1, 3, 10);
      MyThread t3 = new MyThread(2, 3, 10);

      t1.start();
      t2.start();
      t3.start();

   }
}

public class MyThread extends Thread {

    private int startIdx, nThreads, maxIdx;

    public MyThread(int s, int n, int m) {
        this.startIdx = s;
        this.nThreads = n;
        this.maxIdx = m;
    }

    @Override
    public void run() {
        for (int i = this.startIdx; i < this.maxIdx; i += this.nThreads) {

            System.out.println("[ID " + this.getId() + "] " + i);
            Thread.yield();

        }
    }
}




  output:
    [ID 8] 0
    [ID 8] 3
    [ID 8] 6
    [ID 10] 2
    [ID 10] 5
    [ID 10] 8
    [ID 9] 1
    [ID 8] 9

    [ID 9] 4
    [ID 9] 7
4

2 回答 2

2

线程让出和为它们(以及其他操作)设置优先级只是提示调度程序确定线程如何获得或失去处理器使用以及持续多长时间。因此,这些操作对于将分布在多个线程中的业务逻辑按指定顺序处理不是很有用。

你的线程怎么可能没有。2知道,那个线程没有。1 已经打印了“0”?你的线程怎么可能没有。1知道,如果数字“1”和“2”还没有打印,就不允许打印“3”?

如果你想有一个有序的输出,你必须相应地同步你的线程。对于这个例子,它有点复杂,因为它不是展示线程同步的好例子,但它可能有助于学习。

我会给你一些提示:

  1. 您的线程需要了解其他线程的进程。所以他们必须共享共同的数据。
  2. 由于它们还必须读取和更新这些公共数据,因此这些操作必须正确同步。

我建议阅读有关同步的 Java 教程,尝试调整您的程序,并在没有进一步了解的情况下再次询问。

于 2013-11-07T07:32:11.037 回答
0

我只是添加一个token来解决您的问题。Runnable 应该得到token其他yield

private static volatile int token = 0;

@Override
public void run() {

    for (int i = this.startIdx; i < this.maxIdx; i += this.nThreads) {

        while((token) % 3 != startIdx) Thread.yield();

        System.out.println("[ID " + this.getId() + "] " + i);
        token++;
    }

}

输出

[ID 11] 0
[ID 12] 1
[ID 13] 2
[ID 11] 3
[ID 12] 4
[ID 13] 5
[ID 11] 6
[ID 12] 7
[ID 13] 8
[ID 11] 9
于 2013-11-07T07:48:25.187 回答