多线程是提高程序运行效率的一种有效手段,他能让程序同时执行多个操作,但是由于一个程序的多个线程间可能利用同一资源或者互相影响,所以如何让他们协调的工作是一个很大的问题。
在我所经历的多线程使用中,首先遇到的问题就是如何把他们安全的关闭。
遇到的场景是这样的,一个功能线程间隔执行(无限循环加间隔休眠),或是重复执行(使用计时器)。在对其进行关闭时可能遇到关闭指令发出(主线程对子线程执行interrupt命令)时,子线程正在运行,此时有可能抛出异常。
这时候系统很容易发生各种无法预知的错误,为了避免这种错误,我首先使用了一种方法:
自标记法
首先,在线程类里加入一个boolean类型属性,用于标记它的运行状态。一旦需要关闭这个线程,我不是对其执行interrupt而是将他的标记设为false,而线程自身每次运行之前以及运行完某一步操作时,我都让线程自身检测一下自身的标记,如果一旦检测到标记变为了false,就对自身执行interrupt方法,这样就能安全的关闭自己了。
但是这种方法在一些使用HHS或springMVC的项目时,由于有时会使用注解之类的东西,很难去确定是否访问到了自身的标记,所以我又使用了另一种方法:
主线程标记法
因为主线程大多是唯一的,将标记设在主线程,而子线程参照主线程的标记判断是否关闭自己,这样就避免了使用注释时造成子线程不便访问的问题。
归根到底,避免线程关闭异常主要是要使用自关闭,此时由于线程只是在关闭自己而不会执行其他操作,肯定是不会发生异常的,而判断是否进行自关闭,则只需一个参照的标记即可。