前言:我正在学习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块需要至少每隔10ms运行一次。不能单独使用DatagramSocket.setSoTimeout(),因为异常需要在最后一个catch块执行完成后10ms抛出,而不是从最后一个数据包收到10ms。
我的计划:让catch块在关闭socket(ds)之前启动另一个将休眠的线程(10),以便在适当的时间在我的NetworkingThread中抛出catch。 / p>
问题:每次我需要启动10ms计数器时创建新线程会更好吗?或者在完成任务并等待中断重启后,启动一个线程并暂停执行(不使用已弃用的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();
}
}
}
答案 0 :(得分:1)
看一下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