gpt4 book ai didi

java - 线程等待逻辑

转载 作者:行者123 更新时间:2023-12-03 13:10:21 24 4
gpt4 key购买 nike

我有一个只有一组字符串的对象。我可以随时将名称添加到字符串中。我将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秒钟没有添加任何名称,我将打印输出。我无法找到实现此目的的方法。欢迎提出任何想法,因为我是多线程技术的新手。

最佳答案

作为一个非常简单的解决方案,您可以在FamilyGroup类中使用一个标志,该标志指示是否已插入新数据。类似于public boolean HasSomethingNew = false的东西,它在true方法中设置了addName()并在false方法中设置了displayFamilyMembers
然后,您需要在Thread run方法中像这样循环

@Override
public void run() {
boolean EndThread = false;
int WaitingRuns = 0;
while(!EndThread){
while(!group.HasSomethingNew && WaitingRuns < 3){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
WaitingRuns++;
}
if(group.HasSomethingNew){
group.displayFamilyMembers();
WaitingRuns = 0;
} else EndThread = true;
}
}

关于java - 线程等待逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35560429/

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