Java线程输出

标签 java multithreading error-handling operating-system

public class oneThread extends Thread {
    public void run()
    {
        System.out.println("geeks ");
        try {
            Thread.sleep(300);
        }
        catch (InterruptedException ie) {
        }
        System.out.println("forgeeks ");
    }
    public static void main(String[] args)
    {
        oneThread c1 = new oneThread();
        oneThread c2 = new oneThread();
        c1.start();
        c2.start();
        System.out.println(c1.isAlive());
        System.out.println(c2.isAlive());
    }
}

它的实际输出是->
geeks 
true
true
geeks 
forgeeks 
forgeeks

这是怎么回事?

我希望它是->
geeks 
geeks
true
true 
forgeeks 
forgeeks

最佳答案

有许多合法的执行序列可以产生这种输出。

例如:

  • 主要:c1.start()
  • 主要:c2.start()
  • 在线程 1 中: println("geeks")
  • 在线程 1 中: sleep
  • 主要: println(c1.isAlive()); println(c2.isAlive());
  • 在线程 2 中: println("geeks")
  • 在线程 2 中: sleep
  • 在线程 1 中: println("for geeks")
  • 在线程 2 中: println("for geeks")
  • JVM 终止,因为所有线程都已完成

  • 其他可能的执行顺序包括:
  • 第 3 步和第 4 步可能发生在第 2 步之前。
  • 线程 2 可以在线程 1 之前调度。
  • 由于 sleep 时间不精确,线程 2 可能“超过”线程 1。

  • 等等。

    这些都是合法行为,在某些平台上你可能会遇到。

    关于Java线程输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48986272/

    相关文章:

    java - Tomcat 不呈现 jsp 页面

    c - 在循环内动态分配结构

    python - 并行运行两个嵌套的 for 循环以创建矩阵

    javascript - firebase firestore - 如何检查 catch 中的错误

    jQuery ajax 错误处理 "script"dataType

    wcf - “Could not find default endpoint element that references contract”

    java - 计算 H2 数据库中的重复行数

    java - 测试 HashSet 时如何仅从循环中获取一个输出

    c# - C#和SQL Server中嵌套using的使用

    java - Mybatis无法将多列从主查询传递到关联查询