Java终止线程的方式
停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作,也就是放弃当前的操作。
启动一个线程可以调用start();那么停止一个线程可以怎么处理呢?
1、interrupt()
最正确的停止线程的方式是使用 interrupt。
但 interrupt仅仅起到通知被停止线程的作用。
而对于被停止的线程而言,它拥有完全的自主权,它既可以选择立即停止,也可以选择一段时间后停止,也可以选择不停止。
2、shutdown()
调用 shutdown() 方法之后线程池不会立刻就被关闭,因为这时线程池中可能还有很多任务正在被执行,或是任务队列中有大量正在等待被执行的任务,调用 shutdown() 方法后线程池会在执行完正在执行的任务和队列中等待的任务后才彻底关闭。
3、shutdownNow()
如果想要马上关闭线程池,不管正在执行的任务和排队等待的任务,那么shutdownNow则是你最好的选择,强就强在NOW。
4、isTerminated()
这个方法可以检测**线程池是否真正“终结”**了,这不仅代表线程池已关闭,同时代表线程池中的所有任务都已经都执行完毕了.
因为我们刚才说过,调用 shutdown 方法之后,线程池会继续执行里面未完成的任务,不仅包括线程正在执行的任务,还包括正在任务队列中等待的任务。
假如此时已经调用了 shutdown 方法,但是有一个线程依然在执行任务,那么此时调用isShutdown 方法返回的是 true ,而调用 isTerminated 方法返回的便是 false ,因为线程池中还有任务正在在被执行,线程池并没有真正“终结”。
直到所有任务都执行完毕了,调用 isTerminated() 方法才会返回 true,这表示线程池已关闭并且线程池内部是空的,所有剩余的任务都执行完毕了。
Java基础——多线程之线程安全的类
1、StringBuffer
线程安全的可变字符序列
从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
2、Vector
从 Java 2 平台 v1.2 开始,此类改进为可以实现 List 接口,使它成为 Java Collections Framework 的成员。与新 collection 实现不同,Vector 是同步的。如果不需要线程安全的实现,建议使用ArrayList代替Vector
3、Hashtable
此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。
从Java 2 平台 v1.2起,此类就被改进以实现 Map 接口,使它成为 Java Collections Framework 中的一个成员。不像新的 collection 实现,Hashtable 是同步的,如果不需要线程安全的实现,建议使用HashMap代替Hashtable
4、Lock锁
Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定对象
Lock中提供来了获得锁和释放锁的方法
void lock():获得锁
void unlock():释放锁
Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化
ReentrantLock的构造方法
ReentrantLock():创建一个ReentrantLock的实例