gpt4 book ai didi

java - 如何区分锁定到不同实例的线程?

转载 作者:行者123 更新时间:2023-12-02 09:36:08 25 4
gpt4 key购买 nike

我了解到线程可以锁定它们正在使用的“资源”,比如说一个对象,因此一次只允许一个对象使用和修改它,这就是同步问题。我创建了一个类的两个不同实例,并将其提供给我的线程,试图确保它们锁定不同的“资源”。他们怎么仍然表现得好像他们锁定了相同的资源?我很困惑,因为我没有任何关于线程的经验和知识。

这是我根据在线教程修改的代码,以尝试我的想法:

    public class TestThread {
public static void main(String args[]) {
PrintDemo PD1 = new PrintDemo("No.1"); //just prints from 1 to 5
PrintDemo PD2 = new PrintDemo("No.2");

ThreadDemo T1 = new ThreadDemo( "Thread - 1 ", PD1 );
ThreadDemo T2 = new ThreadDemo( "Thread - 2 ", PD2 );

T1.start();
T2.start();
// wait for threads to end
try {
T1.join();
T2.join();
} catch ( Exception e) {
System.out.println("Interrupted");
}
}
}

class ThreadDemo extends Thread {
private Thread t;
private String threadName;
PrintDemo PD;

ThreadDemo( String name, PrintDemo pd) {
threadName = name;
PD = pd;
}

public void run() {
synchronized(PD) {
PD.printCount();
}
System.out.println("Thread " + threadName + " exiting.");
}

public void start () {
System.out.println("Starting " + threadName );
if (t == null) {
t = new Thread (this, threadName);
t.start ();
}
}
}

class PrintDemo {
private String name;
PrintDemo(String name) {
this.name = name;
}
public void printCount() {
try {
for(int i = 5; i > 0; i--) {
System.out.println(name + " Counter --- " + i );
}
} catch (Exception e) {
System.out.println("Thread interrupted.");
}
}
}

每次运行时应该有所不同,但它总是相同的:

输出:

Starting Thread - 1 Starting Thread - 2 No.1 Counter   ---   5No.1 Counter   ---   4No.1 Counter   ---   3No.1 Counter   ---   2No.1 Counter   ---   1Thread Thread - 1  exiting.No.2 Counter   ---   5No.2 Counter   ---   4No.2 Counter   ---   3No.2 Counter   ---   2No.2 Counter   ---   1Thread Thread - 2  exiting.

编辑#1:我按照您的要求放置了整个代码。我还测试了代码而不覆盖启动。它有相同的结果。

最佳答案

如果添加

Thread.sleep(1000)

在 PrintDemo 的每个刻度之间,您可能会看到两个线程执行 5、然后 4、然后 3 等。现在第一个线程太快,它完成的速度比第二个线程可以通过主线程。

同步在这里没有效果,两个线程在不同的资源上同步,这没有效果。在证明(使用 Thread.sleep)两个线程同时执行后,然后在共享对象上添加同步,两个线程将一个接一个地完全执行,即使有等待。

关于java - 如何区分锁定到不同实例的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57500497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com