BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #18269同步于 2011/5/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【求助】杀死一个子线程

xingqitian
2011/5/10镜像同步1 回复
有一种方法是:设置一个变量,在子线程中不断检测这个变量,由父线程控制这个变量来控制子线程的运行。 我程序里的子线程确实是一个循环,但是,我的子线程会阻塞在循环内的某个地方。所以,在子线程阻塞的时候,父线程改变控制变量也是没有用的。 问题来了,有什么办法在父线程中直接杀死指定的子线程吗? 附加一个问题:一个已有的socket连接,在客户端断开连接后,服务器会收到一大堆重新的信息,而且,cpu利用率就开始上升了。怎么解决这个问题? 另外,关闭一个已经断开的连接会出错吗? ps: 我不是凭空发问的,我已经弄了一晚上了,这些就是我要解决的额问题。望高手指点!
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
wks机器人#1 · 2011/5/10
重新设计程序。 有办法避免各种阻塞。如果是因为IO阻塞(读写文件,读写网络socket),就用NIO。如果算法很复杂,太慢,就在其中不断判断Thread.isInterrupted(),使得这个线程可以用theThread.interrupt()停止。 如果要等待另一个线程改变某个共享的状态(比如一个变量),请不要忙等待(在while循环里不断判断一个变量的值),用java.util.concurrent.Condition。它可以让一个线程等它;另一个线程在适当的时候把等待它的线程放行。 Lock myLock = new ReentrantLock(); Condition condition = myLock.newCondition(); boolean jobIsDone = false; 线程1: System.out.println("I am waiting for 线程2 to finish."); myLock.lockInterruptibly(); try { while(!jobIsDone) { condition.await(); } } finally { myLock.unlock(); } System.out.println("no longer waiting!!"); 线程2 System.out.println("Doing long job..."); doSomeJob() System.out.println("Done! now let 线程1 continue."); myLock.lockInterruptibly(); try { condition.signal(); } finally { myLock.unlock(); } System.out.println("线程1 should continue now.");