Java 需要帮助理解该程序吗
我用完整的参考书学习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
// 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");
}