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

时间:2015-02-02 01:23:49

标签: java multithreading sockets

前言:我正在学习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();
        }
    }
}

1 个答案:

答案 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