java/android线程中长的、不可中断的方法的替代方法

java/android线程中长的、不可中断的方法的替代方法,java,android,multithreading,bigdecimal,java-threads,Java,Android,Multithreading,Bigdecimal,Java Threads,在Android应用程序的UI线程中,我需要运行一个可能需要纳秒或永远才能完成的方法。我想我不能确切地确定什么时候它会永远持续下去,所以我在一个单独的线程中通过一个池运行它 myPool=Executors.newCachedThreadPool(newthreadfactory()){ //重写新线程(可运行的r)。。。 }); Future-futureResult=myPool.submit(新的可调用(){ @重写公共结果调用(){ 返回危险方法(); } }); 出于演示的目的,我先

在Android应用程序的UI线程中,我需要运行一个可能需要纳秒或永远才能完成的方法。我想我不能确切地确定什么时候它会永远持续下去,所以我在一个单独的线程中通过一个池运行它

myPool=Executors.newCachedThreadPool(newthreadfactory()){
//重写新线程(可运行的r)。。。
});
Future-futureResult=myPool.submit(新的可调用(){
@重写公共结果调用(){
返回危险方法();
}
});
出于演示的目的,我先阻塞UI一秒钟,然后,如果该方法尚未完成,则继续

试试看{
Result Result=futuresult.get(1,时间单位为秒);
//在这里使用结果
}catch(TimeoutException e){//其他异常也会被忽略
未来结果。取消(真);
Log.d(“DEMO”,“方法花费的时间太长,跳过”);
}
我尝试取消未来并使用
futuresult.cancel(true)
中断其线程,但
dangerousMethod()
不会响应中断,因此线程将继续运行,直到最终完成其任务

我尝试的是:对
ThreadPoolExecutor
进行子类化,并通过反射(
ThreadPoolExecutor$Worker.Thread
)获取私有
线程
),以强制(Bad Practices TM)停止(
stop()
)或停止(
stop0()
(由于
NoSuchMethodException
,因此也不工作)。有关此项的详细信息:

类MyPool扩展ThreadPoolExecutor{
//构造函数、获取线程的反射代码等
无效取消线程(线程线程){
试一试{
thread.stop();
}捕获(安全异常|不支持操作异常e){
试一试{
方法stopMethod=Thread.class.getDeclaredMethod(“stop0”,Object.class);
stopMethod.setAccessible(true);
invoke(thread,newthreaddeath());
}catch(NoSuchMethodException |
调用目标异常|
IllegalAccessException x)
{
Log.d(“MyPool”,“无法停止线程”,x);
}
}
}
}
危险的方法实际上是这样的:

BigDecimal n1=新的BigDecimal(“1E1000000”);
BigDecimal n2=新的BigDecimal(“1”);
BigDecimal result=n1.add(n2);//花费的时间太长
我可以检查我使用的每一个BigDecimal方法是否处理得很好,但我首先想知道我是否遗漏了一些明显的东西,或者是否有其他方法

BigDecimal n3=新的BigDecimal(“1E9999”);
BigDecimal结果=n1.相加(n3);

运行良好。

在Android中,似乎无法强制杀死Java线程-在Oracle Java中,它实际上仍然有效。原因是在Oracle Java中
stop()
调用
stop1()
,而在Android上,它调用
stop(new ThreadDeath())
这又无条件地抛出
不支持操作异常

但是为什么要强迫它停止呢?就让它在后台运行,忘记它,然后继续。当然,你有一些内存和CPU停滞的风险,但是正如你所说的,只有一些数字会导致方法运行那么长时间,所以很有可能你会忘记这个线程,并且能够成功地启动大多数其他线程


如果长时间运行的后台线程在完成后尝试执行操作,您可以设置一个标志,告诉他闭嘴。只要您不需要它的结果,您就可以了。

在Android中,您似乎无法强制杀死Java线程-在Oracle Java中,它实际上仍然有效。原因是在Oracle Java中
stop()
调用
stop1()
,而在Android上它调用
stop(new ThreadDeath())
,这反过来又无条件地抛出
不支持操作异常

但是为什么要强迫它停止呢?就让它在后台运行,忘记它,然后继续。当然,你有一些内存和CPU停滞的风险,但是正如你所说的,只有一些数字会导致方法运行那么长时间,所以很有可能你会忘记这个线程,并且能够成功地启动大多数其他线程


如果长时间运行的后台线程在完成操作后尝试执行操作,您可以设置一个标志,告诉他闭嘴。只要您不需要它的结果,您就很好。

这就是我现在要做的:放弃线程以低优先级单独工作。但我觉得有责任免费使用1个CPU核心。您完全正确-这是你的责任。很遗憾你不能杀死无用的线程…但最终你最重要的责任是让你的应用程序响应。接受。我终于让线程单独运行了,但我还在Activity.onStop()上设置了警报在应用程序未被使用的情况下杀死它。这就是我杀死线程的方式。这就是我现在要做的:放弃低优先级单独工作的线程。但我觉得我有责任免费使用1个CPU内核。你完全正确-这是你的责任。很遗憾你不能杀死无用的线程…但最终你最重要的rtant的责任是让你的应用程序响应。被接受。我终于让线程单独运行了,但我还在Activity.onStop()上设置了一个警报,在应用程序未被使用时终止应用程序。这就是我终止线程的方式。