Anu*_*rma 5 java multithreading synchronization runnable
同步在此代码中正常工作:
class PrintNumbers {
synchronized public void display() {
System.out.println("in display");
for (int i = 0; i < 3; i++) {
System.out.println("Thread name : "+ Thread.currentThread().getName() + " i= " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.getMessage();
}
}
System.out.println("out of display");
}
}
class MyThread implements Runnable {
Thread t;
PrintNumbers printNumbers;
MyThread(PrintNumbers printNumbers, String s) {
this.printNumbers = printNumbers;
t = new Thread(this,s);
t.start();
}
public void run() {
printNumbers.display();
}
}
class SyncExample {
public static void main(String[] args) {
PrintNumbers printNumbers = new PrintNumbers();
new MyThread(printNumbers, "My Thread 1");
new MyThread(printNumbers, "My Thread 2");
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
in display
Thread name : My Thread 1 i= 0
Thread name : My Thread 1 i= 1
Thread name : My Thread 1 i= 2
out of display
in display
Thread name : My Thread 2 i= 0
Thread name : My Thread 2 i= 1
Thread name : My Thread 2 i= 2
out of display
Run Code Online (Sandbox Code Playgroud)
但不在此代码中:
class PrintNumbers {
synchronized public void display() {
System.out.println("in display");
for (int i = 0; i < 3; i++) {
System.out.println("Thread name : "+ Thread.currentThread().getName() + " i= " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.getMessage();
}
}
System.out.println("out of display");
}
}
class MyThread implements Runnable {
Thread t;
PrintNumbers printNumbers;
MyThread(String s) {
this.printNumbers = new PrintNumbers();
t = new Thread(this,s);
t.start();
}
public void run() {
printNumbers.display();
}
}
class SyncExample {
public static void main(String[] args) {
new MyThread("My Thread 1");
new MyThread("My Thread 2");
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
in display
Thread name : My Thread 1 i= 0
in display
Thread name : My Thread 2 i= 0
Thread name : My Thread 1 i= 1
Thread name : My Thread 2 i= 1
Thread name : My Thread 2 i= 2
Thread name : My Thread 1 i= 2
out of display
out of display
Run Code Online (Sandbox Code Playgroud)
我无法理解同步在Runnable MyThread和SyncExample类中初始化PrintNumbers所做的差异.请解释.
我无法理解同步在Runnable MyThread和SyncExample类中初始化PrintNumbers所做的差异.
它没有.什么做的事,在你的第一个例子中,你只有一个 PrintNumbers这两个线程共享实例.但在第二个示例中,您有两个单独的PrintNumbers实例,每个实例对应一个实例.
由于PrintNumbers#display在实例上进行同步(synchronized实例方法同步this),它只在实例内同步,而不是在多个实例之间同步.
当两个线程共享一个实例时,两个调用将display被序列化.但是当每个线程都有自己的实例时,两个调用display都在不同的实例上,因此没有调用的序列化,它们可以重叠.
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |