当前位置: 技术问答>java相关
关于线程监测的问题,高手请看,最好给出例子
来源: 互联网 发布时间:2015-10-18
本文导语: public class MessageGet extends Thread{ public MessageGet(){ start(); } public void run(){ while(true){ doSomething();//这里比较容易出现堵塞,死锁问题。 } } } 现在我想做个监测线程,在上面那个...
public class MessageGet extends Thread{
public MessageGet(){
start();
}
public void run(){
while(true){
doSomething();//这里比较容易出现堵塞,死锁问题。
}
}
}
现在我想做个监测线程,在上面那个线程启动时同时启动,然后判断时间,如果doSomething方法花费时间过长,我就将那个线程停住,并且启动新的MessageGet线程。
我本来是想这么做:
public class MessageGet extends Thread{
private long t;
public MessageGet(){
Thread t1 = new Thread(net Monitor());
t1.start;
start();
}
public void run(){
while(true){
t = System.currentTime();
doSomething();//这里比较容易出现堵塞,死锁问题。
}
}
}
class Monitor implements Runnable{
private MessageGet msg;
public Monitor(MessageGet msg){
this.msg = msg;
}
public void run(){
while(true){
if ((System.currentTime()-msg.t)>1000){//如果时间过长
msg.interrupt(); //停止线程。
new MessageGet;
this.interrupt();
}
}
}
}
但是这么写总有问题,谁能给我更好的思路,最好提供例子
public MessageGet(){
start();
}
public void run(){
while(true){
doSomething();//这里比较容易出现堵塞,死锁问题。
}
}
}
现在我想做个监测线程,在上面那个线程启动时同时启动,然后判断时间,如果doSomething方法花费时间过长,我就将那个线程停住,并且启动新的MessageGet线程。
我本来是想这么做:
public class MessageGet extends Thread{
private long t;
public MessageGet(){
Thread t1 = new Thread(net Monitor());
t1.start;
start();
}
public void run(){
while(true){
t = System.currentTime();
doSomething();//这里比较容易出现堵塞,死锁问题。
}
}
}
class Monitor implements Runnable{
private MessageGet msg;
public Monitor(MessageGet msg){
this.msg = msg;
}
public void run(){
while(true){
if ((System.currentTime()-msg.t)>1000){//如果时间过长
msg.interrupt(); //停止线程。
new MessageGet;
this.interrupt();
}
}
}
}
但是这么写总有问题,谁能给我更好的思路,最好提供例子
|
根据我的经验认为,你的监视线程并未起作用!interrupt()并不会使线程停止!如要简单当然可以用Stop(),但这是不安全的,会导致同步资料不释放!一般在while循环中用(!Interrupted())为条件,另要加入一个变量,如boolean 变量作为条件!一般还是捕获interrupt()产生的IOException异常!
例:
boolean isStop=false ;//定义为类元素
while(!Interrupted() && !isStop){
try{
//to do something
}catch(IOException e){
break; //退出循环
}
}
要终止线程只要使isStop为真或调用interrrup()方法就可以了!
你这里要用interrupt(),因为你是要中断正在进行中的任务!
若不要中断正在进行中的任务就使isStop为“真”会更安全!
第二个线程(监视线程)不用interrupt()真接用break中断循环就可以了!
例:
boolean isStop=false ;//定义为类元素
while(!Interrupted() && !isStop){
try{
//to do something
}catch(IOException e){
break; //退出循环
}
}
要终止线程只要使isStop为真或调用interrrup()方法就可以了!
你这里要用interrupt(),因为你是要中断正在进行中的任务!
若不要中断正在进行中的任务就使isStop为“真”会更安全!
第二个线程(监视线程)不用interrupt()真接用break中断循环就可以了!
|
有点错误!准确的说是InterrruptedException,因为我正在做一个程序,就直接copy 过来了,正确的应是这样!
boolean isStop=false ;//定义为类元素
while(!Interrupted() && !isStop){
//to do something
try{
sleep(50);
}catch(InterruptedException e){
break;
}
boolean isStop=false ;//定义为类元素
while(!Interrupted() && !isStop){
//to do something
try{
sleep(50);
}catch(InterruptedException e){
break;
}
|
对于
while(!Interrupted() && !isStop){
//to do something
try{
sleep(50);
}catch(InterruptedException e){
break;
}
而言,如果 不是sleep(50),, 而是一个IO操作,例如, in.read(),则有可能出现阻塞的问题。
采用 Interrupte()好象只能等到 in.read()返回后才能中断线程。
while(!Interrupted() && !isStop){
//to do something
try{
sleep(50);
}catch(InterruptedException e){
break;
}
而言,如果 不是sleep(50),, 而是一个IO操作,例如, in.read(),则有可能出现阻塞的问题。
采用 Interrupte()好象只能等到 in.read()返回后才能中断线程。
|
应该说最好在线程中加入Sleep()或者Wait()之类的语句。给其他线程执行的机会至于Interrupt()他不会立刻终止线程,必须等到线程运行某个操作结束。最好是调用Wait().
|
所以说,遇到阻塞模式的IO访问很就麻烦了。
好在JDK1.4已经支持了 非阻塞模式的I0访问方式。
好在JDK1.4已经支持了 非阻塞模式的I0访问方式。