Java基础—多线程总结

2018-05-03  本文已影响0人  lemonMT

创建线程的三种方式

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

上一篇 下一篇

猜你喜欢

热点阅读