创建线程的三种方式
1.0 继承Thread类
继承Thread方式2.0实现Runnable接口
实现Runnable接口3.0实现Callable接口
实现callable接口线程的状态
状态Thread类的方法
String getName()返回该线程的名称。
static Thread currentThread():返回对当前正在执行的线程对象的引用。我觉得就是主线程
int getPriority() 返回线程的优先级。
void setPriority(int newPriority) 更改线程的优先级。
static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 但是并没有释放锁。一到时间立马就执行。
void join() 等待该线程终止。
void setDaemon(boolean on) 将该线程标记为守护线程或用户线程。 当只剩下守护线程时jvm将终止
static void yield() 暂停当前正在执行的线程对象,并执行其他线程。 释放了锁,使用后在可运行状态。释放后,执行的必须是级别比他高的。
void stop(Throwable obj) 已过时。 强制终止线程。立马中断。
中断线程: void interrupt() 中断线程。不会立马中断,会执行后中断。
Object类方法与线程方法对比
sleep()与wait() : 1. sleep处于临时阻塞状态,但是并没有释放对象锁, wait在执行后立马释放锁,处于阻塞状态。2. sleep的时间到了,立马执行, wait方法则在执行后如果没有被notify或者notifyAll唤醒则一直处于等待状态。3.wait方法则必须在同步中使用,而sleep不用。
线程同步
synchroized, 可以修饰方法, 代码段,类等。
LOCK使用lock ,只能锁类。
1.synchronized
优点:实现简单,语义清晰,便于JVM堆栈跟踪,加锁解锁过程由JVM自动控制,提供了多种优化方案,使用更广泛
缺点:悲观的排他锁,不能进行高级功能
2.lock
优点:可定时的、可轮询的与可中断的锁获取操作,提供了读写锁、公平锁和非公平锁
缺点:需手动释放锁unlock,不适合JVM进行堆栈跟踪
3.相同点
都是可重入锁
线程池
Executor管理ExecutorService,然后生产各个线程池
newSingleThreadExecutor。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
newFixedThreadPool。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
newCachedThreadPool。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小
newScheduledThreadPool。创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
线程关闭调用 service.shutdown();
ThreadLocal类
线程本地备份,避免并发访问,导致线程数据不安全。
并发包集合
并发包中,全是线程安全的集合。
ConcurrentHashMap,
ConcurrentSkipListMap,
ConcurrentSkipListSet,
ConcurrentLinkedQueue,
ConcurrentLinkedDeque
CopyOnWriteArrayList
CopyOnWriteArraySet
网友评论