需要帮助来理解该计划

时间:2014-01-16 16:40:53

标签: java multithreading

我使用完整的参考书学习Java。我现在处于Multithreded Programming Concept。请帮助我理解这个程序的执行步骤..

// 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");
    }
  }
}

我也无法理解逻辑。

1 个答案:

答案 0 :(得分:0)

好的,让我们逐步了解本守则:

首先,你有三个类:Callme,Caller和Synch。 你的主要方法是在Synch中,让我们从它开始。 在main方法中,您实例化Callme,然后创建三个Caller对象。 现在,让我们看看Caller Constructor:

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

设置Call​​me和传递给构造函数的自定义字符串,然后创建一个新的Thread,传递刚刚创建的Caller对象作为参数。

当你调用t.start时,你只需启动另一个执行线程,它将与你已经运行的主线程并行运行。                  此外,在内部调用start会调用您传递给Thread构造函数的调用者对象中的run方法。 现在,当您实例化其他两个Caller对象时,您的Caller Thread将单独运行 并运行主要方法的其余部分。                          在实例化三个调用者对象后,main方法调用每个调用者的连接:

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

什么连接做的是告诉主线程停止执行并等待这三个其他线程在继续之前结束执行。

现在,让我们回到Caller run方法,看看它的作用是什么?

运行只需在构造函数中设置的CallMe引用上调用方法调用:

  void call(String msg) {
    System.out.print("[" + msg);
    try {
      Thread.sleep(1000);
    } catch(InterruptedException e) {
      System.out.println("Interrupted");
    }
    System.out.println("]");
  }

在这里打印一个你作为参数传递的自定义消息,并在打印最后一个括号之前让currrent线程休眠至少1秒(可能是更多时间)。

总结:在main方法中你创建了三个Caller对象,每个创建一个Callme对象,当你执行main方法时(直到它到达Thread.join方法),每个Caller Thread都在执行自己的副本CallMe调用方法();