有一个线程已经启动,并且是顺序执行代码,代码也就只会执行一次,现在我想在外部发送一个请求,暂停那个已经开始执行的线程,或者取消已经运行的线程,如何做啊?各位大神,帮帮忙啊,用的语言是JAVA,希望不是简单的说什么用wait和notify,我用了wait,抛出illegalmonitorstateexception异常,就算我用suspend都挂起不了,有谁做过这样的例子吗。这种方式是基于web形式的
------解决方案--------------------
你可以通过一个观察者去管理一个Map ,这个map保存的是一个线程id和线程实例 ,你可以从Map拿到实例调用 interrupt方法进行中断
------解决方案--------------------
大概的想法是在执行的线程里再开个监听啥的,不过现在没有细想,要去搬我自己的砖啊
------解决方案--------------------
我后来思考了下 ,其实你这个问题就是一个矛与盾,线程本来就是一个独立的。而你这种情况是属于强行破坏,目前Java 层面只提供了stop方法,这个方法是有风险,这个你可以具体看api说明,如果你这个线程不存在占用公共资源系统资源等的话,你可以通过线程实例直接stop,但是如果的线程里有占用公共资源等的话,你则需要先释放掉在stop ,这里则会出现当你正在使用资源时?你怎么释放?比如一个stream ?你能释放掉吗? 所以说这就是一个矛与盾问题。看你怎么把握
------解决方案--------------------
如果是 想要 尽快的结束线程。需要在逻辑上文章。
而不是在thread 的实例上做文章 比如说thread.stop
首先需要考虑到 程序中那些内容可能会阻塞到该线程的运行,
一般有
socket.accept(); // socket.close 可以打断 throw ioException
procedure.execute(); // close connection 可以打断 throw sqlException
Object.wait(); // Object notify 可以打断
inputStream.read(); // close inputstream可以打断 throw ioException
所以说想结束一个线程。是需要在代码逻辑中进行处理的。比如先说以上的资源需要先处理关闭。继而线程的的生命周期也就随之停止了。
还有需要注意的是 资源的释放问题。
------解决方案--------------------
被“控制”的线程绝对不可能什么都不改就被你控制了,
如果说就按你的条件,顺序执行,中间又不进行任何检测,那么基本上你没办法控制它
------解决方案--------------------
去看看java。util。concuurent包,executorService方法可能能满足你的需求。
例子连接
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html
其中
Method submit extends base method Executor.execute(java.lang.Runnable) by creating and returning a Future that can be used to cancel execution and/or wait for completion. Methods invokeAny and invokeAll perform the most commonly useful forms of bulk execution, executing a collection of tasks and then waiting for at least one, or all, to complete. (Class ExecutorCompletionService can be used to write customized variants of these methods.)