Java多线程问题:死锁的实例
死锁是多线程编程中的一种严重问题。当两个或更多的线程互相等待对方释放资源时,就会出现死锁。
以下是一个简单的死锁实例,使用了Java的Thread类:
// 创建两个共享资源的线程
class ResourceThread extends Thread {
private Object resource;
public ResourceThread(Object resource) {
this.resource = resource;
}
@Override
public void run() {
try {
while (!stopThread) { // 线程无限循环
synchronized (resource) { // 对共享资源加锁
if (requestResource(resource)) { // 如果申请到资源
// 执行任务,然后释放资源
doTask();
resource.notifyAll(); // 通知等待的线程
return;
} else { // 如果未申请到资源,继续循环
resource.wait(); // 等待其他线程释放锁
}
}
}
} catch (Exception e) {
System.out.println("Thread " + getName() + " caught an exception: " + e);
}
}
private boolean requestResource(Object resource) {
synchronized (resource) {
// 假设资源当前可用
return resource.available();
}
}
private void doTask() {
System.out.println("Thread " + getName() + " is executing a task...");
try {
Thread.sleep(2000); // 模拟任务执行时间
} catch (InterruptedException e) {
System.out.println("Thread " + getName() + " interrupted while sleeping: " + e);
}
}
public void stopThread() {
System.out.println("Stopping thread " + getName());
this.stop = true; // 设置线程停止标志
}
}
// 创建两个共享资源的线程实例
ResourceThread thread1 = new ResourceThread(new Object()));
ResourceThread thread2 = new ResourceThread(new Object()));
// 启动线程
thread1.start();
thread2.start();
在这个例子中,线程thread1
和thread2
都试图获取一个共享资源。但是由于某种原因(例如资源有限),其中只有一个线程能成功获得资源。
如果两个线程同时尝试获取资源而一个已经获得了,那么就形成了死锁。在这个例子中,我们可以通过增加线程等待时间来模拟这种情况,从而观察到死锁现象。
还没有评论,来说两句吧...