Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程顺序显示_Java_Multithreading - Fatal编程技术网

Java多线程顺序显示

Java多线程顺序显示,java,multithreading,Java,Multithreading,我有这个程序有3个线程来显示数字1-10。我想让他们按顺序输出,但目前它在跳跃。 示例01 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);

我有这个程序有3个线程来显示数字1-10。我想让他们按顺序输出,但目前它在跳跃。 示例01 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
公共类线程测试
{
公共静态void main(字符串[]args)
{
MyThread t1=新的MyThread(0,3,10);
MyThread t2=新的MyThread(1,3,10);
MyThread t3=新的MyThread(2,3,10);
t1.start();
t2.start();
t3.start();
}
}
公共类MyThread扩展线程{
私有int startIdx、nThreads、maxIdx;
公共神话阅读(int s、int n、int m){
this.startIdx=s;
这个.nThreads=n;
这是maxIdx=m;
}
@凌驾
公开募捐{
for(int i=this.startIdx;i
线程产生和设置优先级(以及其他操作)只是给调度程序的提示,以确定线程如何获得或失去处理器使用率以及持续多长时间。因此,这些操作对于将分布在多个线程中的业务逻辑转换为指定顺序不是很有用

你的2号线程怎么知道1号线程已经打印了“0”?你的1号线程怎么知道,如果数字“1”和“2”还没有打印出来,它就不允许打印“3”

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

我会给你一些提示:

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

  • 我建议您阅读,尝试调整您的程序,如果无法进一步了解,请再次询问。

    我只需添加一个
    标记来解决您的问题。Runnable应该获得
    令牌
    else
    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++;
        }
    
    }
    

    如果你想按顺序打印数字,那么不要使用多个线程!?我想利用线程来加快上传速度。LOL.LOL.所以如果事情以一定的顺序发生,而不是彼此独立,那么在时间轴上,你希望从哪里获得收益?参见线程1从0开始线程2从1开始线程3从3开始线程他们每个人都有自己的事情要做,所以有3个线程我可以运行100万到100万,例如,比单个线程运行得快对不起,但只有当你不想事情按一定的顺序发生时,这才是真的。一个线程不会累。这是否意味着一个简单的线程进程不能按顺序显示1到10。。。您使用的是“序列”一词。因此,您希望有一个“顺序”输出。线程用于执行“并行”工作。看见这些话正好相反。使用线程进行顺序工作需要同步!这将比不使用线程更慢(!)。所以从这个意义上说:不,你不应该使用线程。我知道线程是用于并行工作的,所以我的想法是并行和顺序工作就像1-10B11-20C21-30你可以用一个全局同步计数器来实现这一点,但这完全是胡说八道,因为信息必须保存在线程之外,每个线程只执行三个打印方法。甚至不是平行的。反模式不会变得更糟。硬编码代码内部的预期线程数,使用轮询循环延迟执行等。我的想法来自
    令牌环
    [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