java - 为什么我在这个 java Thread 程序中得到这个输出?

标签 java multithreading

你好,我是java编程的初学者,最近在学习Threads,我在这个程序的输出中遇到了问题。

class s1 implements Runnable 
{ 
    int x = 0, y = 0; 
    int addX() {x++; return x;} 
    int addY() {y++; return y;} 
    public void run() { 
        for(int i = 0; i < 10; i++){ 
            System.out.println(addX() + " " + addY()); 
        }
    } 
    public static void main(String args[]) 
    { 
        s1 run1 = new s1(); 
        s1 run2 = new s1(); 
        Thread t1 = new Thread(run1); 
        Thread t2 = new Thread(run2); 
        t1.start(); 
        t2.start(); 
    } 
}

我得到这样的输出,

1 1 2 2 1 1 3 3...,请解释为什么?

最佳答案

线程是异步执行的——所以它们的输出自然会交织在一起,这是可以预料的。在你的情况下:

1 1 2 2 1 1 3 3

...我“加粗”的部分是一个线程的输出,我留下的部分是另一个线程的输出(开始)。我只能根据程序的执行方式来解决这个问题 - 例如,如果您有两个线程只打印字符“1”,则无法区分哪个线程正在打印哪个字符。

请注意,数字出现的顺序和它们交织的方式完全是任意的——它可能很容易是这样的:

1 1 1 1 2 2 3 3 2 2..

...或任何其他可能的组合。不要依赖您为任何特定程序碰巧获得的顺序,它是完全未定义的。

关于java - 为什么我在这个 java Thread 程序中得到这个输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17022042/

相关文章:

java - 等待来自 RegistrationIntentService 的 token 值

c++ - 访问 std::recursive_mutex 使用的所有者计数器

android - 从 Thread 更新 TextView 仅在 Thread 之后更新

java - 泛型混淆

java - 如何使用Struts编程打印数据库中的数据并显示在ftl页面上

java - XML 文档的索引路径

java - 带有卡住和可滚动组件的 JScrollPane 列标题

java - 按 JButton 时将光标转移到 JTextField

Java:如何构建可扩展的Job处理机制

ios - Core Data 崩溃时出现错误 "dying managedobjectcontext"