Nin*_*ale 4 java multithreading
我有一个关于线程的问题.我有跟随Thread类并创建2个线程对象.
public class MyThread extends Thread{
String name="";
public MyThread(String string) {
name=string;
}
@Override
public void run() {
callMe();
}
synchronized private void callMe() {
System.out.println("Started");
for (int i = 1; i <= 5; i++) {
System.out.println(name+" = "+i);
}
}
public static void main(String[] args) {
MyThread a = new MyThread("A");
MyThread b = new MyThread("B");
a.start();
b.start();
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,我得到的输出是 -
Started
Started
B = 1
B = 2
A = 1
A = 2
B = 3
A = 3
B = 4
A = 4
B = 5
A = 5
Run Code Online (Sandbox Code Playgroud)
我知道当线程调度程序选择它时,A和B会随机打印.
但我的问题是:为什么循环不会一个接一个地执行?我用过synchronized关键字.
Jon*_*eet 13
你的synchronized方法是有效的:
private void callMe() {
synchronized(this) {
System.out.println("Started");
for (int i = 1; i <= 5; i++) {
System.out.println(name+" = "+i);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在你已经创建了两个不同的实例,因此this每个线程都会有所不同......因此它们不会相互同步.如果你想看到两个线程使用同一个监视器,你可以像这样重写你的代码:
public final class DemoRunnable implements Runnable {
@Override
public synchronized void run() {
System.out.println("Started");
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " = " + i);
}
}
public static void main(String[] args) {
Runnable runnable = new DemoRunnable();
Thread a = new Thread(runnable, "A");
Thread b = new Thread(runnable, "B");
a.start();
b.start();
}
}
Run Code Online (Sandbox Code Playgroud)
然后你会得到这样的输出:
Started
A = 1
A = 2
A = 3
A = 4
A = 5
Started
B = 1
B = 2
B = 3
B = 4
B = 5
Run Code Online (Sandbox Code Playgroud)
(当然,它可能是相反的方式.)
我们仍然有两个线程,但它们在同一个对象上调用同步方法(DemoRunnable在本例中为a),因此必须等待另一个完成.
几点:
Runnable通常优先于扩展Thread; 它更灵活Thread对象的同步有其自身的问题,因为Thread类本身就是这样做的; 尽量避免它this- 我通常会有一个类型的私有final变量Object来表示只有我的代码知道的监视器...这样我就可以很容易地看到所有可以在其上同步的代码,这使得它更容易推理每个对象同步工作.要跨实例进行同步,您需要一个共享对象进行同步.
即
private final static Object globalLock = new Object();
// Later
private void callMe() {
synchronized (globalLock) {
System.out.println("Started");
for (int i = 1; i <= 5; i++) {
System.out.println(name+" = "+i);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |