Java8:Kill/Stop某段时间后一个线程
Java 8: Kill/Stop a thread after certain period of time
我有一个基于 java 8 的项目,它在 url 上执行特定功能。我需要修改下面的代码片段,以便它能够在一段时间后杀死 thread/process 运行ning 和 运行 下一个实例,而不管当前进程状态如何。
我尝试了以下技术来实现线程终止程序:
- 执行者服务
- 定时任务
- 多线程线程kill
我最近尝试的代码片段链接如下。
@SuppressWarnings("static-access")
public static void main(String[] args) {
//fetch url from the txt file
List<String> careerUrls = getCareerUrls();
int a = 0;
DBConnection ds = null;
ds = DBConnection.getInstance();
try (java.sql.Connection con = ds.getConnection()) {
//read a single Url
for (String url : careerUrls) {
int c = a++;
ExecutorService executor = Executors.newFixedThreadPool(3);
Future<?> future = executor.submit(new Runnable() {
@Override
// <-- job processing
public void run() {
long end_time = System.currentTimeMillis() + 10000;
System.out.println("STARTED PROCESSING URL: " + url);
jobareaDeciderSample w = new jobareaDeciderSample();
w.mainSample(url, c, con);
}
});
// <-- reject all further submissions
executor.shutdown();
try {
future.get(120, TimeUnit.SECONDS); // <-- wait 2 Minutes to finish
} catch (InterruptedException e) { // <-- possible error cases
System.out.println("job was interrupted");
future.cancel(true);
Thread.currentThread().interrupt();
;
} catch (ExecutionException e) {
System.out.println("caught exception: " + e.getCause());
} catch (TimeoutException e) {
System.out.println("timeout");
future.cancel(true);
}
// wait all unfinished tasks for 2 sec
if (!executor.awaitTermination(0, TimeUnit.SECONDS)) {
// force them to quit by interrupting
executor.shutdownNow();
}
}
} catch (Exception e) {
LOGGER.error(e);
}
}
您的方法是正确的。
在 future 上调用 cancel(true);
是停止此任务的正确方法。
您还有另一个问题 - 您不能只停止线程。 (你可以,在线程 class 中使用 stop() ,但你永远不应该这样做)。
cancel(true);
向线程发送信息,它应该被停止。一些 java classes 正在响应此信息并抛出中断异常。但有些人没有。你必须修改你的任务代码,检查是否Thread.currentThread().isInterrupted()
,如果是,停止执行。
这是你必须在你的代码中做的事情,你调用它
jobareaDeciderSample w = new jobareaDeciderSample();
w.mainSample(url, c, con);
你应该在一些长时间的旋转代码中做这件事,如果你说你用 url 做一些事情,你应该在你的 while 循环中做,在那里你下载网络信息。换句话说,仅当您的代码花费了 99% 的时间时才进行此检查。
你也在打电话
Thread.currentThread().interrupt();
在你的主线程中,这对你没有任何作用,如果你想退出当前线程,你可以调用 return
我有一个基于 java 8 的项目,它在 url 上执行特定功能。我需要修改下面的代码片段,以便它能够在一段时间后杀死 thread/process 运行ning 和 运行 下一个实例,而不管当前进程状态如何。
我尝试了以下技术来实现线程终止程序:
- 执行者服务
- 定时任务
- 多线程线程kill
我最近尝试的代码片段链接如下。
@SuppressWarnings("static-access")
public static void main(String[] args) {
//fetch url from the txt file
List<String> careerUrls = getCareerUrls();
int a = 0;
DBConnection ds = null;
ds = DBConnection.getInstance();
try (java.sql.Connection con = ds.getConnection()) {
//read a single Url
for (String url : careerUrls) {
int c = a++;
ExecutorService executor = Executors.newFixedThreadPool(3);
Future<?> future = executor.submit(new Runnable() {
@Override
// <-- job processing
public void run() {
long end_time = System.currentTimeMillis() + 10000;
System.out.println("STARTED PROCESSING URL: " + url);
jobareaDeciderSample w = new jobareaDeciderSample();
w.mainSample(url, c, con);
}
});
// <-- reject all further submissions
executor.shutdown();
try {
future.get(120, TimeUnit.SECONDS); // <-- wait 2 Minutes to finish
} catch (InterruptedException e) { // <-- possible error cases
System.out.println("job was interrupted");
future.cancel(true);
Thread.currentThread().interrupt();
;
} catch (ExecutionException e) {
System.out.println("caught exception: " + e.getCause());
} catch (TimeoutException e) {
System.out.println("timeout");
future.cancel(true);
}
// wait all unfinished tasks for 2 sec
if (!executor.awaitTermination(0, TimeUnit.SECONDS)) {
// force them to quit by interrupting
executor.shutdownNow();
}
}
} catch (Exception e) {
LOGGER.error(e);
}
}
您的方法是正确的。
在 future 上调用 cancel(true);
是停止此任务的正确方法。
您还有另一个问题 - 您不能只停止线程。 (你可以,在线程 class 中使用 stop() ,但你永远不应该这样做)。
cancel(true);
向线程发送信息,它应该被停止。一些 java classes 正在响应此信息并抛出中断异常。但有些人没有。你必须修改你的任务代码,检查是否Thread.currentThread().isInterrupted()
,如果是,停止执行。
这是你必须在你的代码中做的事情,你调用它
jobareaDeciderSample w = new jobareaDeciderSample();
w.mainSample(url, c, con);
你应该在一些长时间的旋转代码中做这件事,如果你说你用 url 做一些事情,你应该在你的 while 循环中做,在那里你下载网络信息。换句话说,仅当您的代码花费了 99% 的时间时才进行此检查。
你也在打电话
Thread.currentThread().interrupt();
在你的主线程中,这对你没有任何作用,如果你想退出当前线程,你可以调用 return