为什么Java线程会扭曲到控制台的打印

为什么Java线程会扭曲到控制台的打印,java,multithreading,Java,Multithreading,我有一个Java多线程应用程序。在其中一个线程的run方法中,我有一条语句。我的问题是,有时候,我从这张打印中得到的输出不是“打印某物”,而是“打印某物”和其他一些变体。请问这是什么原因?我在run方法中调用的方法如下所示 System.out.println("Print something something something") public synchronized void generateRequests() { String name; int

我有一个Java多线程应用程序。在其中一个线程的run方法中,我有一条语句。我的问题是,有时候,我从这张打印中得到的输出不是
“打印某物”
,而是
“打印某物”
和其他一些变体。请问这是什么原因?我在run方法中调用的方法如下所示

System.out.println("Print something something something")
public synchronized void generateRequests() {

        String name;
        int qty;
        int index = 0;
        System.out.print("Customer " + custId + " requests, ");
        for (Item i : items) {
            name = i.getName();
            qty = randNoGenerator(0, 10);
            items.set(index, new Item(name, qty));
            index++;
            System.out.print(qty + " " + name + ", ");
        }

        s.serviceRequests(this);
    }

了解此问题的示例代码

代码:

  • 在不同的对象上调用synchronized方法(这将混合输出,并且在下次运行时可能会有所不同)


    不,给我们看看你的代码。因为没有代码,我猜你实际上有多个线程,每个线程打印一个单词。在这种情况下,线程将以不可预测的顺序运行,因此打印单词的顺序将因运行而异。@SotiriosDelimanolis我添加了一些代码。希望它能帮助你明白你的期望是什么以及实际发生了什么。一个小的可复制的例子最好。我有5个线程使用上述方法生成请求,并打印出生成的请求。请求是适当生成的,但问题是它没有按照我指定的顺序打印生成的内容。它随机打印,有时从项目开始,而不是开始"客户…你很接近,但我的问题是,没有这样的客户:0客户:1客户:4客户:2客户:3客户:2000.0客户:3000.0客户:1000.0客户:4000.0我有客户:0:1客户:4客户:23客户:0.0客户:2000.0 3000客户:1000.0客户:1000.0客户:1000.0昆蒂:4000.0我无法复制它。请分享你的完整代码好吗?
    public class MultiThreading implements Runnable {
    
        private String id;
        private double qt;
    
        public MultiThreading(String id, double qt) {
            this.id = id;
            this.qt = qt;
        }
    
        public static void main(String[] args) {
            MultiThreading obj = new MultiThreading("1", 1000);
            for (int i = 0; i < 5; i++) {
                // Thread thread = new Thread(new MultiThreading(String.valueOf(i), (i * 1000)));
                Thread thread = new Thread(obj);
                thread.setPriority(i + 1);
                thread.start();
            }
        }
    
        public synchronized void generateRequests() {
    
            System.out.println("Customer:" + this.id);
            try {
                Thread.sleep(100);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("Quentity:" + this.qt);
        }
    
        @Override
        public void run() {
            generateRequests();
        }
    
    }
    
        MultiThreading obj = new MultiThreading("1", 1000);
        for (int i = 0; i < 5; i++) {                
            Thread thread = new Thread(obj);
            thread.setPriority(i + 1);
            thread.start();
        }
    
    Customer:1
    Quentity:1000.0
    Customer:1
    Quentity:1000.0
    Customer:1
    Quentity:1000.0
    Customer:1
    Quentity:1000.0
    Customer:1
    Quentity:1000.0
    
       for (int i = 0; i < 5; i++) {
            Thread thread = new Thread(new MultiThreading(String.valueOf(i), (i * 1000)));
            thread.setPriority(i + 1);
            thread.start();
        }
    
    Customer:0
    Customer:1
    Customer:4
    Customer:2
    Customer:3
    Quentity:0.0
    Quentity:2000.0
    Quentity:3000.0
    Quentity:1000.0
    Quentity:4000.0