java - 为什么 Java Thread 会扭曲控制台的打印

标签 java multithreading

我有一个 Java 多线程应用程序。在其中一个线程的 run 方法中,我有一个

System.out.println("Print something something something")
陈述。我遇到的问题是,有时,我从此打印中得到的输出不是 "Print something something something"但是"something Print something something"以及其他一些变化。请问这是什么原因呢?我在 run 方法中调用的方法如下所示。

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

关于java - 为什么 Java Thread 会扭曲控制台的打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22441225/

相关文章:

java - 将可调用内的可调用提交给执行程序服务会导致程序挂起

c# - 获取唯一的线程 ID

java - 在 Robotium 中进行单元测试时检查 WebView 的 URL

java - YUV图像处理

multithreading - 重新实现 JavaFX showAndWait

multithreading - Openmp:与omp_get_thread_num()并行使用

mysql - 带线程的 Perl 邮件队列 'out of memory'

java - 尝试使用生成的命名查询时出现 sqlException 错误

java - 当我使用 json.encode 时,使用 Vert.x 的 JSON 库时出现问题

java - Box2D 在碰撞后阻止动态物体移动