【问题标题】:isAlive() execution in java multithreading [duplicate]java多线程中的isAlive()执行[重复]
【发布时间】:2017-09-03 13:29:27
【问题描述】:

下面给出的代码演示了在 java 多线程中使用 isAlive()... 我无法解释显示的输出序列。我期望的输出是 r1 r1 true true r2 r2
谁能帮我解决这个问题。

public class MyThread extends Thread
{
    public void run()
    {
        System.out.println("r1 ");
        try {
                Thread.sleep(200);
        }
        catch(InterruptedException ie) { }
        System.out.println("r2 ");
    }
    public static void main(String[] args)
    {
        MyThread t1=new MyThread();
        MyThread t2=new MyThread();
        t1.start(); 
        t2.start();
        System.out.println(t1.isAlive());
        System.out.println(t2.isAlive());
    }
}

输出: r1 真的 真的 r1 r2 r2

【问题讨论】:

  • 不,不应该。您正在启动 2 个线程,您的输出完全取决于调度和其他事情。如果您正在寻找特定的输出,则此代码不会给出它。它可以在您运行它的时间之间改变。
  • 为什么你认为输出应该是你所期望的?
  • 你还没有真正解释为什么你认为输出应该是你认为的那样。您最好查看 Oracle 提供的并发教程文档,然后在仍有不清楚的地方完善您的问题。 docs.oracle.com/javase/tutorial/essential/concurrency/…
  • 这段代码没有确定性的输出:推理线程代码的最佳方法是考虑每一行代码(在每条汇编指令处)的上下文切换。你头脑中的推理应该总是问:如果上下文切换发生在当前指令中,会发生什么,如果没有发生,会发生什么。 t1.start() 并不意味着 t1 将只执行一次,即 t1 将在任何 cpu 上执行。 t1.start() 只是在内核中添加线程并推送到调度队列中,并不意味着线程会立即获得cpu执行。

标签: java multithreading


【解决方案1】:

输出

r1
true 
true 
r1 
r2 
r2

如果两个线程都在运行但其中一个(可能但不一定是第二个)已开始运行但尚未达到System.out.println("r1"),这是完全合理的。

如果没有进一步的同步结构,这是“竞争条件”的简单示例。

竞态条件或竞态危险是电子设备的行为, 软件或其他系统的输出取决于 其他不可控事件的顺序或时间。

https://en.wikipedia.org/wiki/Race_condition

注意:PrintStreamSystem.out 是其中的一个实例)不能保证是线程安全的,因此至少在理论上可能会出现丢失某些打印的结果。

【讨论】:

  • System.out 似乎是线程安全的,我不明白最后一段的意思。
  • @NathanHughes 看起来确实如此。但我找不到任何保证。
  • 是的,这只是错误信息,println() 及其变体是线程安全的,您永远不会从不同的调用中获得混合输出。 public void println(String x) { synchronized (this) { print(x); newLine(); } }
  • @JarrodRoberson 是否在不查看源代码的情况下记录了这一点?我找不到任何声明。
  • @JarrodRoberson 什么?绝对不。 Java API 文档,语言参考,这些都是权威文档。您碰巧看到的任何 Java 实现的源代码都是不是
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 2020-03-15
  • 1970-01-01
相关资源
最近更新 更多