1

我正在使用 SOOT 框架进行一些静态分析。但是,有时分析需要几个小时,我想设置一个超时来停止分析并继续使用另一个程序。

为了实现这种行为,我在一个线程中运行分析:

thread = new Thread(new Runnable() { run(){ buildCallgraph(); } )};

!!buildCallgraph() 方法由 SOOT 提供,我没有机会更改它。!!

目前我不知道如何停止线程。中断不起作用,因为 buildCallgraph() 从不检查它的线程是否已被中断。不应使用 Thread.stop()。

那么,有没有人知道如何终止线程?

问候罗伯特

4

3 回答 3

1

不使用 有充分的理由Thread.stop(),那么换一种方法怎么样:不要在单独的线程中运行分析,而是尝试将其作为单独的程序运行

这意味着对性能的影响很小,但实际上,与当前时间的规模相比,任务创建和序列化/反序列化结果不应产生可衡量的影响。

与jvm 不同Thread.stop()的是,杀死一个程序会导致一个干净的退出,因为 jvm 退出了。

这样做的缺点是您后续问题的答案(“我如何从 java 程序中启动任务”、“我如何等待另一个程序的完成”和“我如何以编程方式杀死另一个程序” ) 都特定于操作系统。

好处是他们已经回答了:

  1. 如何在java程序中启动外部程序
  2. Java:等待exec进程直到它退出
  3. 强制杀死子进程的Java工具/方法
于 2013-10-21T18:19:45.383 回答
0

您如何维护启动线程的时间戳?
将线程命名为“我爱 BOOT framweork”。然后,在 a 中Timer,检查是否Thread仍在运行。

如果在 中Timer,您发现所用时间超过了时间量,则停止线程。

于 2013-10-21T17:46:17.573 回答
0

使用 Java,您不能真正抢先终止线程。当我进行此类测量时,我总是使用 unix“超时”命令在某个时间范围后关闭 Soot。显然,这实际上会在没有以优雅的方式完成运行的情况下杀死 Soot。

于 2013-10-22T06:37:52.893 回答