当前位置: 代码迷 >> J2EE >> 一个线程怎么去控制另一个线程
  详细解决方案

一个线程怎么去控制另一个线程

热度:108   发布时间:2016-04-17 23:52:46.0
一个线程如何去控制另一个线程
有一个线程已经启动,并且是顺序执行代码,代码也就只会执行一次,现在我想在外部发送一个请求,暂停那个已经开始执行的线程,或者取消已经运行的线程,如何做啊?各位大神,帮帮忙啊,用的语言是JAVA,希望不是简单的说什么用wait和notify,我用了wait,抛出illegalmonitorstateexception异常,就算我用suspend都挂起不了,有谁做过这样的例子吗。这种方式是基于web形式的
------解决方案--------------------
你可以通过一个观察者去管理一个Map ,这个map保存的是一个线程id和线程实例 ,你可以从Map拿到实例调用  interrupt方法进行中断
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

mark下,自己也试了下,要是直接终止的话好办,要是暂停的话还没实现

终止你是如何做到的?请说说

拿到线程直接interrupt(),但是直接sleep或者wait之类是不起作用的,楼上说的管道啊、观察者模式都无法判断在哪操作,你说的,线程就顺序执行一遍,又不能循环,总不能执行一句业务代码判断一次吧,我理解的没错吧

是的,你理解的很对,其实线程里面执行的是许多句sql语句,所以只是执行一遍。我之前试了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.)
  相关解决方案