Почему Java Thread искажает печать на консоль [дубликаты]

1

У меня многопоточное приложение на Java. В методе выполнения одного из потоков у меня есть оператор

System.out.println("Print something something something")
. Проблема в том, что иногда вывод, который я получаю из этого отпечатка, - это не "Print something something something" а "something Print 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);
    }
Теги:
multithreading

1 ответ

1

Пример кода для понимания этой проблемы.

код:

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
  • 0
    Вы подошли близко, но моя проблема в том, что вместо того, чтобы иметь что-то вроде этого Клиента: 0 Клиента: 1 Клиента: 4 Клиента: 2 Клиента: 3 Количество: 0.0 Количество: 2000.0 Количество: 3000.0 Количество: 1000.0 Количество: 4000.0 У меня есть Клиент: 0: 1 Клиент Клиент: 4 Клиент: 2 3: Количество клиентов: 0.0 Количество: 2000.0 3000 Количество: Количество: 1000.0 Количество: 4000.0
  • 0
    Я не могу воспроизвести это. Пожалуйста, вы можете поделиться своим полным кодом?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню