У меня многопоточное приложение на 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);
}
Пример кода для понимания этой проблемы.
код:
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