gpt4 book ai didi

Java - 模拟3个线程之间的死锁并设置优先级

转载 作者:行者123 更新时间:2023-12-02 07:20:33 25 4
gpt4 key购买 nike

我有以下 3 个线程:

// These are the two resource objects we'll try to get locks for
final Object resource1 = "resource1";
final Object resource2 = "resource2";
final Object resource3 = "resource3";
// Here's the first thread. It tries to lock resource1 then resource2
Thread t1 = new Thread() {
public void run() {

// Lock resource 1
synchronized(resource1) {
System.out.println("Thread 1: locked resource 1");

// Pause for a bit, simulating some file I/O or something.
// Basically, we just want to give the other thread a chance to
// run. Threads and deadlock are asynchronous things, but we're
// trying to force deadlock to happen here...
try { Thread.sleep(50); } catch (InterruptedException e) {}

// Now wait 'till we can get a lock on resource 2
synchronized(resource2) {
System.out.println("Thread 1: locked resource 2");
}
}
}
};

// Here's the second thread. It tries to lock resource2 then resource1
Thread t2 = new Thread() {
public void run() {

// This thread locks resource 2 right away
synchronized(resource2) {
System.out.println("Thread 2: locked resource 2");

// Then it pauses, for the same reason as the first thread does
try { Thread.sleep(50); } catch (InterruptedException e) {}

// Then it tries to lock resource1. But Thread 1 locked
// resource1, and won't release it till it gets a lock on
// resource2. This thread holds the lock on resource2, and won't
// release it 'till it gets resource1.
synchronized(resource1) {
System.out.println("Thread 2: locked resource 1");
}
}
}
};


// t3 tries to lock resource3 then resource2
Thread t3 = new Thread() {
public void run() {
for(int i=1; i<=5;i++)
System.out.println("t3 "+i);
synchronized (resource3) {
System.out.println("Thread 3: locked resource 3");

try {
Thread.sleep(50);
} catch (InterruptedException e) {
}

synchronized (resource2) {
System.out.println("Thread 3: locked resource 2");
}
}
}
};

现在我想做的是模拟死锁,程序停止了,我猜这导致了死锁。

问题出现后,我在 synchronized 函数之前添加了一个 for 循环来在每个线程中打印一些文本。但是,当我使用 setPriority 设置每个线程的优先级时,我看不到线程根据其优先级完成其工作。

例如,在第一个同步之前,我在每个线程中都有这些for循环:

for(int i=1; i<=5;i++)
System.out.println("t2 "+i);

依此类推,t2 代表线程 2。我要做的就是确保优先级正常工作。我还没有尝试在非死锁程序中根据线程的优先级来运行线程。

操作系统或 CPU 可能是导致此类问题的原因?

最后,我的最后一个问题是我可以在资源、打印和执行时间方面展示优先效果吗?

谢谢:)

最佳答案

大多数通用操作系统上的线程优先级不是绝对的(例如,准备运行的最高优先级线程总是获得 CPU),而是计算允许线程的时间量或时间长度的调度算法的输入在将控制权交给另一个人之前运行。

因此,即使您设置了优先级,线程的运行顺序也不确定。您可以放心地假设的是,优先级最高的线程可能会比优先级较低的线程获得更大份额的 CPU 时间。然而,当您的程序执行重复的 IO(阻塞)然后 hibernate 时,线程很可能无论如何都无法达到它们的量程,并且在 50 毫秒的 hibernate 结束时都同样有资格运行。

一类操作系统 - 实时操作系统 (RTOS) - 确实实现了优先级驱动的抢占式线程行为(而不是时间切片),并且可以产生高度可预测的线程排序。

关于Java - 模拟3个线程之间的死锁并设置优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14299535/

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