相关疑难解决方法(0)

如何超时一个线程

我想在一段固定的时间内运行一个线程.如果它没有在那段时间内完成,我想杀死它,抛出一些异常,或以某种方式处理它.怎么做到呢?

我从这个线程 中发现的一种方法是在Thread的run()方法中使用TimerTask.

有没有更好的解决方案呢?

 
编辑:添加赏金,因为我需要一个更清晰的答案.下面给出的ExecutorService代码没有解决我的问题.为什么我应该在执行后睡觉()(一些代码 - 我没有处理这段代码)?如果代码完成并且sleep()被中断,那怎么可能是timeOut?

需要执行的任务不在我的控制范围内.它可以是任何一段代码.问题是这段代码可能会遇到无限循环.我不希望这种情况发生.所以,我只想在一个单独的线程中运行该任务.父线程必须等到该线程完成并且需要知道任务的状态(即它是否超时或发生了一些异常或者是否成功).如果任务进入无限循环,我的父线程会无限期地等待,这不是一个理想的情况.

java multithreading timeout timer

246
推荐指数
7
解决办法
23万
查看次数

如何停止通过实现runnable接口创建的线程?

我通过实现runnable接口创建了类,然后在我的项目的其他一些类中创建了许多线程(将近10个).
如何阻止其中一些线程?

java multithreading thread-safety

55
推荐指数
4
解决办法
15万
查看次数

Tomcat请求超时

在我的Web应用程序中,有一些请求持续时间超过20秒.但在某些情况下,代码可能导致无限循环或类似的东西,从而减慢服务器的速度.

我想在服务器端将请求超时60秒.这是在tomcat中实现的吗?

谢谢,Horatiu

java tomcat timeout request java-ee

44
推荐指数
3
解决办法
13万
查看次数

一旦他们开始,你如何杀死期货?

我正在使用新concurrent.futures模块(也有一个Python 2 backport)来做一些简单的多线程I/O. 我无法理解如何干净地杀死使用此模块启动的任务.

查看以下Python 2/3脚本,它重现了我所看到的行为:

#!/usr/bin/env python
from __future__ import print_function

import concurrent.futures
import time


def control_c_this():
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        future1 = executor.submit(wait_a_bit, name="Jack")
        future2 = executor.submit(wait_a_bit, name="Jill")

        for future in concurrent.futures.as_completed([future1, future2]):
            future.result()

        print("All done!")


def wait_a_bit(name):
    print("{n} is waiting...".format(n=name))
    time.sleep(100)


if __name__ == "__main__":
    control_c_this()
Run Code Online (Sandbox Code Playgroud)

当这个脚本运行时,似乎无法使用常规的Control-C键盘中断干净地杀死它.我在OS X上运行.

  • 在Python 2.7上,我不得不kill从命令行求助于杀死脚本.Control-C被忽略了.
  • 在Python 3.4上,如果你点击两次,Control-C就可以工作,但是会抛弃很多奇怪的堆栈跟踪.

我在网上找到的大多数文档都讨论了如何用旧threading模块干净地杀死线程.这似乎都不适用于此.

concurrent.futures模块中提供的所有停止内容(如Executor.shutdown()Future.cancel())的方法仅在Futures尚未启动或完成时才起作用,这在这种情况下毫无意义.我想立即打断未来.

我的用例很简单:当用户点击Control-C时,脚本应该像任何行为良好的脚本一样立即退出.这就是我想要的.

那么在使用时获得此行为的正确方法是concurrent.futures什么?

python multithreading concurrent.futures

32
推荐指数
2
解决办法
1万
查看次数

停止/销毁线程

我有一个启动Thread和Runnable的服务.

t = new Thread(new Runnable() {
    public void run() {
        doSomething();
    }
});

t.start();
Run Code Online (Sandbox Code Playgroud)

该线程的原因是执行异步任务doSomething().现在让我们不要担心其他类AsyncTask.我已经尝试过它并不适用于我的情况.编辑:我不能使用AsyncTask,因为它仅适用于UI线程.这段代码必须在服务内部运行,所以nope,没有AsyncTask :(

doSomething()包含一些外部库,所以我遇到的问题是它可能挂在其中一个命令上,而不返回任何值(因此甚至不能进行错误检查)

为解决这个问题,我希望在某些时候破坏服务.

stopService(new Intent("net.MyService.intent));
Run Code Online (Sandbox Code Playgroud)

这很好,很容易在手机上验证.但是,即使生成它的服务被销毁,上面创建的Thread也将继续运行.

因此,我正在寻找在Service的onDestroy()中插入的正确命令,它将为我清理Thread.

t.destroy();
t.stop();
Run Code Online (Sandbox Code Playgroud)

都折旧并导致应用程序崩溃.

我从某个地方拿了这个代码

@Override
public void onDestroy() {

    Thread th = t;
    t = null;

    th.interrupt();

    super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)

但它仍然无效,线程继续运行.有帮助吗?

service multithreading android

19
推荐指数
2
解决办法
3万
查看次数

Java:如何阻止线程?

有没有办法从线程的OUTSIDE停止另一个线程?就像,如果我运行一个线程来运行该线程并导致该线程停止?它会阻止其他线程吗?

有没有办法在没有循环的情况下从内部停止线程?例如,如果您正在理想地下载,则需要使用循环,如果我使用循环,则无法暂停它直到它到达循环结束.

java multithreading

18
推荐指数
4
解决办法
11万
查看次数

如果没有中断,Future.cancel()会做什么?

来自Future.cancel()上的java文档

boolean cancel(boolean mayInterruptIfRunning)
Run Code Online (Sandbox Code Playgroud)

尝试取消执行此任务.如果任务已完成,已取消或由于某些其他原因无法取消,则此尝试将失败.如果成功,并且在调用cancel时此任务尚未启动,则此任务永远不会运行.如果任务已经启动,则mayInterruptIfRunning参数确定执行此任务的线程是否应该在尝试停止任务时被中断.

我的问题是,如果mayInterruptIfRunning为false,取消会怎么做?
如果任务已经运行,它如何取消或停止执行?

java multithreading future interrupt

17
推荐指数
2
解决办法
1万
查看次数

从spring mvc app提交后台任务

我有工作的春季MVC应用程序,我接下来要做的是从我的应用程序启动或提交后台任务.

基本上,即使用户决定在应用程序上执行其他操作,我也会继续执行任务,直到完成为止.

但是如果需要的话,我还想停止/杀死/暂停任务.因为在我寻找一个好的/更好的方法之前我没有这样做过.

我发现这些很有用:

http://blog.springsource.com/2010/01/05/task-scheduling-simplifications-in-spring-3-0/

你如何在Java中杀死一个线程?

Java线程:是否可以从同一JVM上运行的不同java程序查看/暂停/终止特定线程?

所以我想使用@Async任务来提交我的后台任务,但是想要稍后使用线程的id获取它并在需要时停止它?

这是正确的方法吗?我对多线程没有任何经验,所以我在这里听.

代码更新:

public interface Worker {
    public void work();
    public void cancel();
}
Run Code Online (Sandbox Code Playgroud)

实施:

@Component("asyncWorker")
public class AsyncWorker implements Worker {

    @Async
    public void work() {
        String threadName = Thread.currentThread().getName();
        System.out.println("   " + threadName + " beginning work");
        try {
                Thread.sleep(10000); // simulates work
        } catch (InterruptedException e) {
            System.out.println("I stopped");
        }
        System.out.println("   " + threadName + " completed work");
    }

    public void cancel() { Thread.currentThread().interrupt(); }
}
Run Code Online (Sandbox Code Playgroud)

控制器用于测试目的:

@ResponseBody
@RequestMapping("/job/start")
public …
Run Code Online (Sandbox Code Playgroud)

java multithreading spring-mvc

11
推荐指数
1
解决办法
8271
查看次数

如何检查线程是否已完成Rust?

当我spawn在Rust中使用一个线程时,我得到一个JoinHandle,这对于...加入(一个阻塞操作)是好的,而不是其他的.如何检查子线程是否JoinHandle.join()已从父线程退出(即,不会阻止)?如果您知道如何杀死子线程,则可获得奖励积分.

我想你可以通过创建一个频道,向孩子发送一些东西,捕捉错误来做到这一点,但这似乎是不必要的复杂性和开销.

multithreading rust

10
推荐指数
4
解决办法
2521
查看次数

用Java清理线程

我有一个Java方法,它对输入集执行两次计算:估计和准确的答案.估计总是可以廉价地在可靠的时间内计算出来.准确的答案有时可以在可接受的时间内计算,有时不会(不知道先验......必须试着看).

我想要设置的是一些框架,如果准确答案花费太长时间(固定超时),则使用预先计算的估计.我想我会使用一个线程.主要的复杂因素是计算准确答案的代码依赖于外部库,因此我无法"注入"中断支持.

针对此问题的独立测试用例就在这里,展示了我的问题:

package test;

import java.util.Random;

public class InterruptableProcess {
    public static final int TIMEOUT = 1000;

    public static void main(String[] args){
        for(int i=0; i<10; i++){
            getAnswer();
        }
    }

    public static double getAnswer(){
        long b4 = System.currentTimeMillis();
        // have an estimate pre-computed
        double estimate = Math.random();

        //try to get accurate answer
        //can take a long time
        //if longer than TIMEOUT, use estimate instead
        AccurateAnswerThread t = new AccurateAnswerThread();
        t.start();

        try{
            t.join(TIMEOUT);
        } catch(InterruptedException ie){
            ;
        }

        if(!t.isFinished()){
            System.err.println("Returning estimate: …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading

9
推荐指数
1
解决办法
2016
查看次数