【发布时间】:2016-02-22 17:48:44
【问题描述】:
我有一个只有一组字符串的对象。我可以随时向字符串添加名称。我将 5 秒设置为完成添加要设置的名称的最大等待时间。之后,我将打印集合中的所有名称。所以我为我的对象定义了以下类。
public class FamilyGroup {
Set<String> names;
private long id;
public FamilyGroup(long id) {
this.id = id;
names = new HashSet<String>();
}
public void addName(String name) {
names.add(name);
}
public void displayFamilyMembers() {
for (String string : names) {
System.out.println(string);
}
}
}
我正在将此作业提交给 Runnable,如下所示,
public class FamilyWaiterThread implements Runnable {
private FamilyGroup group;
private final long MAX_WAITING_TIME = 1000 * 15;
FamilyWaiterThread(FamilyGroup group) {
this.group = group;
}
@Override
public void run() {
try {
Thread.sleep(MAX_WAITING_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
group.displayFamilyMembers();
}
}
此代码等待 15 秒,然后成功打印集合中的所有名称。这就是我正在测试它的方式。
public class FamilyTest {
public static void main(String[] args) throws InterruptedException {
FamilyGroup familyGroup1 = new FamilyGroup(1L);
familyGroup1.addName("Shane Lee");
FamilyWaiterThread familyWaiterThread1 = new FamilyWaiterThread(familyGroup1);
new Thread(familyWaiterThread1).start();
Thread.sleep(2000);
familyGroup1.addName("Bret Lee");
}
}
我在生成新线程 2 秒后添加名称“Bret Lee”,该新线程等待 15 秒并打印两个名称。输出是
Shane Lee
Bret Lee
假设我在 16 秒后添加名称“Bret Lee”,
Thread.sleep(16000);
familyGroup1.addName("Bret Lee");
它只打印“Shane Lee”,因为线程只等待 15 秒。 现在我想再添加一项功能。如果连续 5 秒没有添加名称,我希望线程停止等待并打印输出。如果在 5 秒内添加了任何名称,则线程应继续最多侦听 15 秒。总而言之,我对组对象的最长等待时间是 15 秒。 15 秒后,我肯定会打印输出,如果至少 5 秒内没有添加名称,我将打印输出。我想不出办法来实现这一点。欢迎任何想法,因为我是多线程的新手。
【问题讨论】:
-
您正在寻找的概念称为Watchdog Timer。在 FamilyGroup 的构造函数中,您创建了两个看门狗定时器:第一个周期为 15 秒,第二个周期为 5 秒。每次添加名称时都会重置后者。第一个计时,打印名称。 注意您需要适当的同步原语以避免数据竞争。
标签: java multithreading