Java线程:暂停/恢复线程与终止/启动新线程

Java线程:暂停/恢复线程与终止/启动新线程,java,multithreading,sockets,Java,Multithreading,Sockets,前言:我正在学习Java,经验不多。如果1)我用一种愚蠢的方式做这件事,或者2)我的问题不清楚,我诚挚的道歉。我很想知道我的方法是否都错了,所以请试着告诉我光明,而不是简单地告诉我我在黑暗中(我已经很清楚我被黑暗包围了,哈哈)。我很乐意更新/编辑这篇文章,提供您需要的任何其他信息,请询问我。我尝试过搜索这个,但不是我使用了错误的关键字,就是这个问题太愚蠢了,任何人都问不出来 class NetworkingThread implements Runnable { @Override

前言:我正在学习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();
            }
    }
}
问题:捕捉块至少需要每10毫秒运行一次。无法单独使用DatagramSocket.setSoTimeout(),因为需要在最后一个捕获块执行完成后10毫秒而不是在收到最后一个数据包后10毫秒引发异常

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

问题:每次需要启动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();
        }
    }
}
看看哪些已经提供了您希望实现的功能

您的代码应该如下所示

ScheduledExecutorService executor = Executors.newScheduledThreadPool(someValue);
executor.scheduleWithFixedDelay(new SomeThread(), 0, 10, TimeUnit.MILLISECONDS);
SomeThread
将实现
Runnable
并包含业务逻辑;不考虑调度、重新运行等,除了任何符合业务/系统要求的异常处理

p.S.:通常不建议使用
异常
作为流量控制

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

    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); 
    }
ScheduledExecutorService executor=执行者
.newScheduledThreadPool(10);
ScheduledFuture结果=executor.scheduleWithFixedDelay(()->{//do
//某物
},0,10,时间单位为毫秒);
试一试{
//这将使任务在5毫秒后超时。
获取(5,时间单位毫秒);
}捕获(InterruptedException | ExecutionException | TimeoutException e){
//处理异常
结果:取消(true);
}

我冒昧地假设您使用的是
java8

不要将递归用作迭代技术。您所做的只是添加另一个故障模式。正如建议的,您应该使用
while(true){}
块进行迭代,而不是递归。如果你使用递归来创建一个无限循环,你会在某个时候出现内存错误。谢谢David SN为我的错误提供了一个解决方案。我有一种(错误的)印象,认为回避和while(真的)是一样的。有人能解释为什么重复调用会导致内存错误,而while(true)语句不会?把我指向一个URL也很好:)我只是想知道为什么在任何事情中都会有一个“StackOverflowException”,因为递归通过方法调用消耗堆栈。通过
while(true)
进行迭代不会这样做。首先,谢谢!其次,如果不建议使用异常作为流控制,我应该如何中断像DatagramSocket.receive()这样的NetworkIO块?当receive()阻塞时,Thread.interrupt不起作用。线程不会检查中断标志。最后,我仍然不确定暂停/恢复一个线程比每隔这么多毫秒创建一个新线程好还是坏,直到应用程序关闭。我想,因为我唯一的暂停/恢复线程的解决方案需要使用流控制异常,所以你的答案应该是不要暂停/重新启动它?希望上面的内容不会显得粗鲁,字符限制让我删掉了很多笑话不,没有!!:)关于暂停/恢复/中断等问题,您很幸运,因为Java也有这种功能。检查编辑是否相同。哇,这太完美了!:)非常感谢你!我正在使用Java8,但只是出于好奇,(如果你不介意我问你更多的问题),如果我改用Java7,这种情况会发生什么变化?我不是,只是我想学习,7的文档页面看起来和你在上面对我做的完全一样。哦,等等……也许我误解了(很可能,如果我误解了,请道歉),但是这个解决方案是否仍然使用要求我使用异常作为流控制(尽管更少)?阻塞线程将重复超时并抛出一个将被捕获的异常。这不是一个坏主意吗?另外,我在谷歌上搜索了为什么不使用异常作为流控制,并学到了很多。谢谢你:)