【问题标题】:Kill thread in java after a certain time一段时间后杀死java中的线程
【发布时间】:2017-06-17 03:34:15
【问题描述】:

我有一个如下用例(在 JAVA 中)

我收到客户的请求

例如:在此日期之前执行 twitter 流式传输任务。

  • 任务 = 推特流媒体
  • 关键字 = {"#Today", "#apple"}
  • 时间 = 到 2017 年 2 月 5 日

我所做的是,我会在收到的每个请求上打开一个新线程,并启动我的任务,即流式传输推文并将它们保存到数据库中。

我想要做的是线程应该停止流式传输并且应该在此日期(2 月 5 日)之后被杀死。

如何实现这种类型的用例?

【问题讨论】:

  • 中断线程。
  • 线程是否在循环中?您可以查看当前日期并在 2 月 5 日之后退出吗?
  • 请添加相关代码。
  • 这里有一个例子。有两个任务,一个执行主程序,另一个计划在特定时间中断第一个。 stackoverflow.com/questions/11794313/…
  • 使用 volatile 布尔值来控制循环(形式为 while !stop)。当您在某个日期之后阅读第一条推文时,只需将 stop 设置为 true。

标签: java multithreading twitter twitter4j


【解决方案1】:

您可以使用Calendar 类并检查例如

Calendar c = Calendar.getInstance(TimeZone.getTimeZone(ZoneId.of("CET")));
c.set(Calendar.MONTH, 1)
c.set(Calendar.DAY_OF_MONTH, 5)
c.set(Calendar.HOUR_OF_DAY, 23);
c.set(Calendar.MINUTE, 59);
c.set(Calendar.SECOND, 59);
c.set(Calendar.MILLISECOND, 999);

while(true){
 Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(ZoneId.of("CET")));
 if(cal.getTime().after(c.getTime()) return;
}

【讨论】:

  • 感谢您的回答。无需使用 while 循环即可实现此目的的任何其他方式。
  • @PrakashPandey 没有用于在线程上设置到期计时器的内置方法。您可以通过像我的回答那样在线程中设置到期时间来做到这一点,或者通过上面的另一个对象杀死线程的 cmets 之一来做到这一点。
  • Murat,垃圾收集器会在return;之后移除所有线程资源吗?
  • @PrakashPandey 是的,如果您不再引用线程。如果它是匿名的,它将被垃圾收集。
  • Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, 2017); c.set(Calendar.MONTH, 2); c.set(Calendar.DAY_OF_MONTH, 2); c.set(Calendar.HOUR_OF_DAY, 20); c.set(Calendar.MINUTE, 43); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0);
猜你喜欢
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2018-10-18
  • 2011-02-13
  • 2012-11-18
相关资源
最近更新 更多