
Google 前几页的文章都看过了,没找到什么好办法,特来请教各位,我目前写的部分相当于一个框架,我提供 2 个按钮,开始和停止,点击开始后新启一个线程执行别人的代码,点击停止后杀掉这个线程,我并不能控制别人代码里面都判断了 InterruptedException 异常,那这种情况下我有什么办法强行停止线程内的操作呢? Thread.stop()方法已经被移除了,好像没有替代的了?
1 wzwwzw 2019-10-01 17:26:54 +08:00 有 pid 么,交给操作系统杀掉。 |
2 sadfQED2 OP |
3 tachikomachann 2019-10-01 17:48:37 +08:00 via Android Thread.stop() 之所以移除原因就是强制杀掉线程会有不可预料的错误。 所以正确的做法是用类似信号量控制的方式,让线程安全退出。 |
4 Macolor21 2019-10-01 17:50:05 +08:00 class CustomThread implement Runnable{ private boolean flag=true; @Override public void run() { while(flag){ } } |
6 aguesuka 2019-10-01 18:26:49 +08:00 via Android 最不差的方法可能是,用线程池,shutDownNow。如果能改接口,返回一个 Futrue,实现曲线。 |
7 pwrliang 2019-10-01 18:27:48 +08:00 via Android 没法控制别人的代码,那就起进程,直接杀掉 |
8 BCy66drFCvk1Ou87 2019-10-01 18:30:06 +08:00 via Android 信号量 semaphore |
9 aguesuka 2019-10-01 18:33:22 +08:00 via Android 如果中断异常中断不了,那就用进程 start 和 kill |
10 Takamine 2019-10-01 18:59:25 +08:00 via Android 用一个 SingleThreadPool 呢。 |
11 Raymon111111 2019-10-01 20:10:39 +08:00 把别人的代码放在 while(true) 里跑, 然后来个状态位 |
12 magiclz233 2019-10-01 20:47:58 +08:00 stop()强行停止,不建议使用了,如果你确定你的代码不会导致死锁或者数据不一致什么的,可以直接用 stop,或者用 interrupt,还有就是给线程代码中加异常,触发异常的话就会自动跳出了。又或者加判断条件。不过不推荐 |
13 sadfQED2 OP @Macolor21 #5 信号控制我当然知道啊,但是别人的逻辑并不确定,万一别人写个 while(true)呢。 @Raymon111111 #11 别人的代码只是给我一个入口,只调用一次,并不是多次调用 @magiclz233 #12 stop()已经移除了,强制杀死我也知道可能会出一些资源回收等等问题,但是因为没发控制别人的代码,所以必须得自己想办法出问题的时候保证能结束 @aguesuka #6 @Takamine #10 我考虑下 |
14 Raymon111111 2019-10-01 23:29:27 +08:00 @sadfQED2 想想应该确实是做不到的, while(true) 这种应该是无法打断的. |
15 helloSpringBoot 2019-10-01 23:59:11 +08:00 via Android 之前也想过这个问题,强行终止只有 stop,但是现在已经废弃,不推荐使用。 其它只能是协作式终止,中断加 flag 标志一起使用。 如果对方代码不响应中断,那没有安全的办法了。 java 并发编程实战有一章专门讲了这个问题。 |
16 momocraft 2019-10-02 00:01:14 +08:00 子进程可能比较容易 |
17 coolcfan 2019-10-02 00:05:39 +08:00 线程池的 shutdownNow()也不能停止正在进行的任务。 |
18 lastpass 2019-10-02 02:30:23 +08:00 via Android 如果你写的这个框架与你的应用不是同一个进程。 继承对方的执行主类,添加一个停止的监听器方法。此监听被触发时,直接 system.exit() |
19 sadfQED2 OP @lastpass 也不行,我是给别人提供一个回调函数,别人在回调函数里面写他的逻辑,在回调函数里面我并不知道他怎么写,他的主类是啥 |
20 STRRL 2019-10-02 10:48:42 +08:00 和他明确的说明要做 InterruptedException, 写到和他交接的文档里面. |
21 yulon 2019-10-02 14:23:27 +08:00 合作:让他改。 逆向:系统 API,做好崩溃的打算。 |
OP @STRRL #20 嗯,好像确实没其他方法了,只有在文档里面加要求了 @helloSpringBoot #15 安不安全无所谓,stop 已经没有了,不然我用 stop 就好了,我怕的是别人代码里面万一写个类似 while(true)的代码,跳不出来 |
23 0xZhangKe 2019-10-03 11:41:00 +08:00 用 flag 配合中断标志位。 while(!stop){ try{ ... } catch(InteruptException e){ if(stop) return; } } 再向外部暴露一个停止线程方法: public void stop(){ stop = true; yourThread.interrupt(); } |
24 kaminic 2019-10-03 18:50:52 +08:00 via Android 很明显,提需求让对方加退出接口,同时做好内部资源的释放 |