终止一个线程的特殊方法

来源:互联网 发布:电脑怎么隐藏软件 编辑:程序博客网 时间:2024/05/21 08:58

很多java的服务器端程序,主处理往往是一个很大的循环,如下:

while(runFlag == true){       operation1;       operation2;       operation...;}
如果我们想要将这个程序停止运行,只要把runFlag设置成false即可。

但是这有一个问题:如果循环处理里的操作很耗费时间的话,那么停止这个程序将耗费很长时间,

在有些情况下,漫长的等待可能会导致一些错误,例如:windows服务。

那怎样才能快速终止这个程序呢? 我们不可能在循环里的每一个处理【operationX】前都加上一个判断,如下:

while(runFlag == true){       operation1;       <span style="color:#ff0000;">if(runFlag == false){              break;       }</span>       operation2;       <span style="color:#ff0000;">if(runFlag == false){              break;       }</span>       operation...;}
因为这样会降低程序的运行效率,而且这样的代码也太可笑了。


那怎么办呢?答案就是将这个循环处理放到一个守护线程中去执行,守护线程的特点是当所有非守护线程都终了后,守护线程将自动终了。

这样,我们只需要将所有的处理都放到一个守护线程里,主线程为非守护线程,并且主线程什么也不做,只处于休眠状态就可以了。

如果我们想要终止这个程序,就唤醒主线程,让主线程终了,这样整个程序也就终了了。

大致的结构如下:

private Object lock = new Object();private volatile boolean runFlag = true;public static void main(String[] args) {}public void work(){// 初始化处理(打开文件,数据库连接,网络连接等)init();// 主处理启动(守护线程启动)Thread mainOperation = new Thread(new myOperaion());mainOperation.setDaemon(true);mainOperation.start();// 主线程休眠synchronized (lock) {try {lock.wait();} catch (InterruptedException e) {}}// 终了处理(关闭文件,数据库连接,网络连接等)release();}// 主处理线程class myOperaion implements Runnable {@Overridepublic void run() {while(runFlag){// 消耗大量时间的处理}}}

当然,有一点要注意,那就是关闭文件,数据库连接,网络连接的操作不能放在守护线程里。




0 0
原创粉丝点击