返回信息流有一种方法是:设置一个变量,在子线程中不断检测这个变量,由父线程控制这个变量来控制子线程的运行。 我程序里的子线程确实是一个循环,但是,我的子线程会阻塞在循环内的某个地方。所以,在子线程阻塞的时候,父线程改变控制变量也是没有用的。
问题来了,有什么办法在父线程中直接杀死指定的子线程吗?
附加一个问题:一个已有的socket连接,在客户端断开连接后,服务器会收到一大堆重新的信息,而且,cpu利用率就开始上升了。怎么解决这个问题? 另外,关闭一个已经断开的连接会出错吗?
ps: 我不是凭空发问的,我已经弄了一晚上了,这些就是我要解决的额问题。望高手指点!
这是一条镜像帖。来源:北邮人论坛 / java / #18269同步于 2011/5/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【求助】杀死一个子线程
xingqitian
2011/5/10镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
重新设计程序。
有办法避免各种阻塞。如果是因为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.");