gpt4 book ai didi

Java线程: Pause/Resume Thread vs Terminiate/Start New Thread

转载 作者:太空宇宙 更新时间:2023-11-04 06:14:32 25 4
gpt4 key购买 nike

前言:我正在学习Java,但经验不是很丰富。如果 1)我以一种愚蠢的方式解决这个问题或 2)我的问题不清楚,我深表歉意。我很想知道我的方法是否完全错误,所以请尝试向我展示光明,而不是简单地告诉我我处于黑暗中(我已经很清楚我被黑暗包围了,哈哈)。我很乐意用您需要的任何其他信息来更新/编辑这篇文章,请询问我。我尝试过搜索这个问题,但要么我使用了错误的关键字,要么这个问题太愚蠢了,任何人都不会问。

class NetworkingThread implements Runnable {
@Override
public void run() {//Need this to throw SocketException every 10ms
try {
DatagramPacket dataPacket = receive(ds);//networkIO blocking
//do something
this.run();//recursive call
}
catch (SocketException | SocketTimeoutException e0){
//do something
this.run();//recursive call
}
catch (Exception e1) {
e1.getMessage();
}
}
}

问题: catch block 需要至少每 10 毫秒运行一次。不能单独使用 DatagramSocket.setSoTimeout(),因为需要在最后一个 catch block 执行完成后 10 毫秒抛出异常,而不是距离上次收到数据包 10 毫秒。

我的计划:让 catch block 启动另一个线程,该线程在关闭 receive(ds) 套接字之前将 hibernate (10),以便在适当的时间将 catch 抛出到我的 NetworkingThread 中。

问题:每次需要启动 10 毫秒计数器时创建一个新线程是否更好?或者启动一个线程并在完成任务后暂停执行(不使用已弃用的 API)并等待中断来重新启动它?下面是我的想法的例子。欢迎任何替代解决方案。

class TimerThreadOne implements Runnable {
@Override
public void run() {
try {
Thread.currentThread().sleep(10);
//close socket or interrupt thread in some way
}
catch (Exception e) {
e.getMessage();
}
}
}

class TimerThreadTwo implements Runnable {
@Override
public void run() {
try {
Thread.currentThread().sleep(10);
//close socket or interrupt thread in some way
Thread.currentThread().sleep(1000000);//sleep until interrupted
}
catch (InterruptedException eInterrupt){
this.run();//recursive call
}
catch (Exception e) {
e.getMessage();
}
}
}

最佳答案

看看ScheduledThreadPoolExecutor它已经提供了您想要实现的功能。

您的代码应如下所示。

ScheduledExecutorService executor = Executors.newScheduledThreadPool(someValue);
executor.scheduleWithFixedDelay(new SomeThread(), 0, 10, TimeUnit.MILLISECONDS);

SomeThread将实现Runnable并包含业务逻辑;除了符合业务/系统要求的任何异常处理之外,无需考虑调度、重新运行等。

P.S.:一般情况下不建议使用Exception作为流量控制。

编辑
等待长时间运行的任务超时

    ScheduledExecutorService executor = Executors
.newScheduledThreadPool(10);
ScheduledFuture<?> result = executor.scheduleWithFixedDelay(() -> {// do
// something
}, 0, 10, TimeUnit.MILLISECONDS);

try {
// this will timeout the task after 5ms.
result.get(5, TimeUnit.MILLISECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
// handle exception
result.cancel(true);
}

我冒昧地假设您使用的是 Java 8

关于Java线程: Pause/Resume Thread vs Terminiate/Start New Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28269927/

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