题目如下:
三个线程同时启动如下:
t1.start();
t2.start();
t3.start();
第一个线程 (t1) 的输出应该是第二个线程 (t2) 的输入,第二个线程 (t2) 的输出应该是第三个线程 (t3) 的输入。
你能告诉我逻辑吗?
我知道我们可以使用对象的等待和通知方法。但是我可以获得实现此输出的算法或逻辑吗?
最佳答案
这是给你的帮助类。它在单例助手类中实现了两个资源锁。
让每个线程使用ResourceLock.getInstance()
获取实例。让线程 2 调用 getResource1()
并等待线程 1 完成并将其输出放入 setResource1()
。这释放了锁,线程二对 getResource1()
的调用返回。
重复线程 2 和 3
在没有超时的情况下调用挂起函数并不是一个好主意。因此有 10 秒的超时,根据您的需要进行编辑。
package com.madinsweden.test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class ResourceLock {
protected static final int TIMEOUT = 10000; //ms
private CountDownLatch mLock1;
private CountDownLatch mLock2;
private Object mObject1;
private Object mObject2;
private static ResourceLock mInstance;
private ResourceLock() {
mLock1 = new CountDownLatch(1);
mLock2 = new CountDownLatch(1);
}
public static ResourceLock getInstance() {
if (null == mInstance) {
mInstance = new ResourceLock();
}
return mInstance;
}
public void setObject1(Object o) {
mObject1 = o;
mLock1.countDown();
}
public Object getResource1() {
try {
mLock1.await(TIMEOUT, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
throw new RuntimeException("Timeout of resource lock 1");
}
return mObject1;
}
public void setObject2(Object o) {
mObject2 = o;
mLock2.countDown();
}
public Object getResource2() {
try {
mLock2.await(TIMEOUT, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
throw new RuntimeException("Timeout of resource lock 2");
}
return mObject2;
}
}
关于java - 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16602243/