问:运行一半的线程能否强制杀死?
在Java中, stop()、destory() 之类的函数官方明确不建议这样使用, 如果强制杀死线程,则线程中使用到的资源, 例如 文件描述符, 网络连接等不正常关闭。
一个线程一旦运行起, 就不要强行打断它, 合理的关闭方法是让其运行完(也就是函数执行完毕), 干净的释放掉所有的资源, 然后退出。如果一个不断运行的线程,就需要用到线程间通信机制,让主线程通知其退出。
守护线程
当在一个JVM进程里开多个线程时, 这些线程被分成两类:守护线程和非守护线程。默认开的是非守护线程。
当所有的非守护线程退出后, 整个JVM进程就会退出。意思是 守护线程“不算数”, 守护线程不影响整个JVM进程的退出。 例如:垃圾回收线程就是守护线程, 他们在后台默默工作, 当开发者的所有前台线程(非守护线程)都退出之后, 整个JVM进程就退出了。
InterruptedException 函数与Interrupt 函数
什么情况下会抛出interrupted 异常
只有声明了会抛出interruptedException 的函数才会抛出异常
例如
public static native void sleep(long millis) throws InterruptedException{...} public final void wait() throws InterruptedException{...} public final void join() throws InterruptedException{...}
轻量级阻塞与重量级阻塞
轻量级阻塞 :能够被中断的阻塞。对应的线程状态时Waiting 或者 Timed_Waiting
重量级阻塞 :像synchronized 这种不能被中断的阻塞。对应的状态Blocked
t.isInterrupted() 与 Thread.interrupted() 函数
t.interrupted()相当于给线程发送一个唤醒的信号, 如果线程此时恰处于waiting 或者 timed_waiting 状态, 就会抛出一个InterruptedException,并且线程被唤醒。而如果线程此时并没有阻塞,则线程什么都不会做。但在后续,线程可以判断自己是否收到过其他线程发来的中断信号,然后做一些对应的处理。
前者是静态函数,后者是非静态函数, 两者之间的区别在于前者只是读取中断状态,不做修改状态; 后者不仅读取中断状态, 还会重置中断标志位。
收录于合集 #Java线程
2个
下一篇并行,并发?