Java 需要帮助理解该程序吗

Java 需要帮助理解该程序吗,java,multithreading,Java,Multithreading,我用完整的参考书学习Java。我现在处于多线程编程概念中。请帮助我理解此程序的执行步骤 // This program is not synchronized. class Callme { void call(String msg) { System.out.print("[" + msg); try { Thread.sleep(1000); } catch(InterruptedException e) { System.out.prin

我用完整的参考书学习Java。我现在处于多线程编程概念中。请帮助我理解此程序的执行步骤

// This program is not synchronized.
class Callme {
  void call(String msg) {
    System.out.print("[" + msg);
    try {
      Thread.sleep(1000);
    } catch(InterruptedException e) {
      System.out.println("Interrupted");
    }
    System.out.println("]");
  }
}

class Caller implements Runnable {
  String msg;
  Callme target;
  Thread t;

  public Caller(Callme targ, String s) {
    target = targ;
    msg = s;
    t = new Thread(this);
    t.start();
  }

  public void run() {
    target.call(msg);
  }
}

class Synch {
  public static void main(String args[]) {
    Callme target = new Callme();
    Caller ob1 = new Caller(target, "Hello");
    Caller ob2 = new Caller(target, "Synchronized");
   Caller ob3 = new Caller(target, "World");

    // wait for threads to end
    try {
      ob1.t.join();
      ob2.t.join();
      ob3.t.join();
    } catch(InterruptedException e) {
      System.out.println("Interrupted");
    }
  }
}
    try {
  ob1.t.join();
  ob2.t.join();
  ob3.t.join();
} catch(InterruptedException e) {
  System.out.println("Interrupted");
}  

我也不能理解逻辑。

好的,让我们一步一步地分析一下这段代码:

    try {
  ob1.t.join();
  ob2.t.join();
  ob3.t.join();
} catch(InterruptedException e) {
  System.out.println("Interrupted");
}  
首先,您有三个类:Callme、Caller和Synch。 您的主要方法是同步的,让我们从它开始。 在main方法中,实例化Callme,然后创建三个调用方对象。 现在,让我们看看调用方构造函数:

 public Caller(Callme targ, String s) {
    target = targ;
    msg = s;
    t = new Thread(this);
    t.start();
  }
    try {
  ob1.t.join();
  ob2.t.join();
  ob3.t.join();
} catch(InterruptedException e) {
  System.out.println("Interrupted");
}  
设置Callme和传递给构造函数的自定义字符串,然后创建一个新线程,将刚刚创建的调用方对象作为参数传递

    try {
  ob1.t.join();
  ob2.t.join();
  ob3.t.join();
} catch(InterruptedException e) {
  System.out.println("Interrupted");
}  
调用t.start时,只需启动另一个执行线程,该线程将与已经运行的主线程并行运行。 另外,在内部调用start调用传递给线程构造函数的调用方对象中的run方法。 现在,在实例化其他两个调用方对象时,调用方线程将单独运行 然后运行main方法的其余部分。 实例化三个调用方对象后,主方法对每个调用方调用join:

    try {
  ob1.t.join();
  ob2.t.join();
  ob3.t.join();
} catch(InterruptedException e) {
  System.out.println("Interrupted");
}  
join所做的是告诉主线程停止执行,并等待其他三个线程结束执行,然后再继续

    try {
  ob1.t.join();
  ob2.t.join();
  ob3.t.join();
} catch(InterruptedException e) {
  System.out.println("Interrupted");
}  
现在,让我们回到调用方运行方法,看看它做了什么,好吗

    try {
  ob1.t.join();
  ob2.t.join();
  ob3.t.join();
} catch(InterruptedException e) {
  System.out.println("Interrupted");
}  
在构造函数中设置的CallMe引用上运行just call方法调用:

    try {
  ob1.t.join();
  ob2.t.join();
  ob3.t.join();
} catch(InterruptedException e) {
  System.out.println("Interrupted");
}  
  void call(String msg) {
    System.out.print("[" + msg);
    try {
      Thread.sleep(1000);
    } catch(InterruptedException e) {
      System.out.println("Interrupted");
    }
    System.out.println("]");
  }
在这里,您可以打印作为参数传递的自定义消息,并使当前线程至少休眠1秒。打印最后一个括号之前可能需要更长的时间

    try {
  ob1.t.join();
  ob2.t.join();
  ob3.t.join();
} catch(InterruptedException e) {
  System.out.println("Interrupted");
}  

总结一下:在main方法中创建三个Caller对象,每个对象创建一个Callme对象,当main方法执行时,直到它到达Thread.join方法,即每个调用线程都在执行自己的Callme call方法副本

@HighCore无法理解您的comment@HighCoreJava还支持同步/等待设置,但是如果选择,也可以将Runnable类子类化。无论如何,通常在Java中,您只需使用synchronize/wait,或者如果您正在存储数据,您可能会使用volatile变量类型。@dylanlawrence在C语言中对/continuation语言级别的支持还远远不够。请帮我理解上述程序。我只是个初学者。@user3203399你到底不懂什么?目前的问题过于宽泛,无法明智地回答。
    try {
  ob1.t.join();
  ob2.t.join();
  ob3.t.join();
} catch(InterruptedException e) {
  System.out.println("Interrupted");
}