Thread currentThread=Thread.currentThread();
public void run()
{
while(!shutdown)
{
try
{
System.out.println(currentThread.isAlive());
Thread.interrupted();
System.out.println(currentThread.isAlive());
if(currentThread.isAlive()==false)
{
shutdown=true;
}
}
catch(Exception e)
{
currentThread.interrupt();
}
}
}
});
thread.start();
Run Code Online (Sandbox Code Playgroud) 我到处看看如何在Java中强制停止一个线程,我看到"只需要执行一个退出变量检查,如果你需要强行杀死,你的程序就会被破坏."
我有一个相当独特的情况.我正在编写一个Java程序,它在一个单独的线程中动态加载和运行其他Java类.(请不要对安全风险发表评论,这是一个非常具体的用例).
麻烦的是,由于其他人已经编写了需要加载的类,因此无法保证他们将实现停止检查等等.我需要一种方法来立即终止他们的线程,接受所涉及的所有风险.基本上我想要kill -9他们的线程,如果我需要.我怎么能用Java做到这一点?
更新:这里有更多信息:
这实际上是一个Android应用程序
用户代码取决于我的应用程序中的类
必须对用户类进行注释@UserProgram才能由我的应用程序"注册"
用户还可以选择在应用程序中构建类(通过下载已经编译成库并将其类放在单独模块中的内部类的项目),而不是从JAR动态加载它们.
用户类从我的模板类扩展而来,模板类有一个runUserProgram()覆盖的方法.在这种方法中,他们可以自由地做任何他们想做的事情.他们可以查看isStopRequested()我是否希望他们停止,但我不能保证他们会这样做.
在启动时,我的应用程序加载指定的任何JAR,并扫描应用程序中的所有类和这些JAR中的类,以查找使用上述注释注释的任何类.一旦构建了这些类的列表,就会将其提供给前端,其中UI提供可以运行的程序列表.选择程序后,必须按下"开始"按钮才能实际启动它.按下该按钮后,该按钮将变为"停止"按钮,并向后端发出回调以在新线程中加载所选类并调用该runUserProgram()方法.按下"停止"按钮时,会设置一个导致isStopRequested()返回的变量true.
到目前为止,在我对 executorservice 的实验中,我有很多建议涉及使用 future.get,然后使用 future.cancel 来抛出一个线程中断,然后需要在线程中捕获该中断并在那里处理。我的问题有点不同。
假设我正在运行一个线程,它只是跟踪事情运行了多长时间,如果它们超过某个阈值,这是否是杀死 executorservice 和所有正在运行的线程的好方法?
示例思维过程:
ExecutorService threadPool = Executors.newFixedThreadPool(12);
timekeeper.start();
List<Future<?>> taskList = new ArrayList<Future<?>>();
for (int i = 0; i < objectArray.length; i++) {
Future<?> task = threadPool.submit(new ThreadHandler(objectArray[i], i));
taskList.add(task);
Thread.sleep(500);
}
if(timekeeper.now() > 60)
threadpool.shutdownNow();
}
Run Code Online (Sandbox Code Playgroud)
这行得通吗?我无法检查,因为我的线程很少失败(大约 1/700 运行,并且仅在我不工作的一天中的特定时间)。
我刚刚阅读了Thread.stop函数的JDK文档.它说,
停止线程会导致它解锁已锁定的所有监视器.如果先前受这些监视器保护的任何对象处于不一致状态,则其他线程现在可以在不一致状态下查看这些对象.这些对象被认为已损坏.当线程对受损对象进行操作时,可能会导致任意行为.
我只是不太明白.什么是一个不一致的状态是什么意思?
并且可以在什么专横的行为呢?有人可以向我解释一下吗?
(我的问题与您认为重复的问题有点不同.我强调可能的损坏,而前者强调可以用什么方法代替Thread.stop.)
Thread.stop() 的 Java Docs 听起来好像如果你曾经调用 Thread.stop() 世界就会结束。
已弃用. 这种方法本质上是不安全的。使用 Thread.stop 停止线程会使其解锁所有已锁定的监视器(这是未经检查的 ThreadDeath 异常向上传播堆栈的自然结果)。如果先前受这些监视器保护的任何对象处于不一致状态,则损坏的对象将对其他线程可见,从而可能导致任意行为。stop 的许多用途应该被替换为简单地修改一些变量以指示目标线程应该停止运行的代码。目标线程应该定期检查这个变量,如果变量表明它要停止运行,则以有序的方式从它的 run 方法返回。如果目标线程等待很长时间(例如,在条件变量上),应该使用interrupt方法来中断等待。有关更多信息,请参阅为什么不推荐使用 Thread.stop、Thread.suspend 和 Thread.resume?。
例如,如果我在 3rd 方的封闭源代码库中运行一个方法,并且我需要保证它在 5 分钟或更短的时间内结束,还有其他方法吗?使用 Thread.stop() 的实际后果是什么,我如何确定它们是否发生?
fun main() = runBlocking {
var i = 1
var job = launch (Dispatchers.Default){
println("Thread name = ${Thread.currentThread().name}")
while (i < 10) { // replace i < 10 to isActive to make coroutine cancellable
delay(500L)
// runBlocking { delay(500L) }
println("$isActive ${i++}")
}
}
println("Thread name = ${Thread.currentThread().name}")
delay(2000L) // delay a bit
println("main: I'm tired of waiting!")
job.cancelAndJoin() // cancels the job and waits for its completion
println("main: Now I can quit.")
}
Run Code Online (Sandbox Code Playgroud)
输出
Thread name = main
Thread …Run Code Online (Sandbox Code Playgroud)