java线程相关知识点整理

1、创建新线程实例:
Extends Thread类并重写run方法,创建这个类的实例即可;
或者创建一个类,实现Runnable接口,实现run方法,通过将这个类的实例传入Thread的构造器来创建一个Thread实例,这实例调用start方法时,这个实现类实现的run方法会在这个单独运行中的线程种被自动调用。
两种方法的比较:实现runnable接口更适合于if you are only planning to override the run() method and no other Thread methods.

2、Runnable接口:
The Runnable interface should be implemented by any class whose instances are intended to be executed by a thread. 这些类必须实现该接口的无参数run方法。这个接口也只有这一个方法。
In most cases, the Runnable interface should be used

3、线程池ThreadPoolExecutor
1)就是一个复用线程的机制,采用一个由实现了runnable接口的类实例作为元素的队列,多个线程循环从队列中取出任务并调用其run方法运行,这样就实现了对线程的复用。它实现了interrupt方法可以中断当前全部线程

2)使用线程池的好处:
减少在创建和销毁线程上所花的时间以及系统资源的开销
如果不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。

3)java提供的线程池的种类:
提供了几种不同的构造器,通过限制一些参数来表现特定线程池的一些特点。
a、newFixedThreadPool 队列长度没有限制
创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。

b、newCachedThreadPool 线程数量没有限制

创建一个可缓存的线程池。这种类型的线程池特点是:
1).工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。
2).如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。

c、newSingleThreadExecutor创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证顺序执行(我觉得这点是它的特色)。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的 。

总结:FixedThreadPool是一个典型且优秀的线程池,它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。但是,在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。 
CachedThreadPool的特点就是在线程池空闲时,即线程池中没有可运行任务时,它会释放工作线程,从而释放工作线程所占用的资源。但是,但当出现新任务时,又要创建一新的工作线程,又要一定的系统开销。并且,在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。 

4)其他:
线程池可嵌套,树形
线程池与线程池之间是相互隔离的,不可访问父线程池的信息不可访问其他线程池的信息

4、sychronize关键字和volitale关键字,happens before原则
Happens-before 关系
happens-before 关系保证:如果线程 A 与线程 B 满足 happens-before 关系,则线程 A 执行动作的结果对于线程 B 是可见的。如果两个操作未按 happens-before 排序,JVM 将可以对他们任意重排序。
下面介绍几个与理解 ConcurrentHashMap 有关的 happens-before 关系法则:
* 程序次序法则:如果在程序中,所有动作 A 出现在动作 B 之前,则线程中的每动作 A 都 happens-before 于该线程中的每一个动作 B。
* 监视器锁法则:对一个监视器的解锁 happens-before 于每个后续对同一监视器的加锁。先释放再获取。
* Volatile 变量法则:对 Volatile 域的写入操作 happens-before 于每个后续对同一 Volatile 的读操作。
* 传递性:如果 A happens-before 于 B,且 B happens-before C,则 A happens-before C。

5、线程安全的容器类
copyOnwriteArrayList 采用copy on write机制,写时存在两个副本
Vector
ConcorrentHashMap还没看

6、Object的wait() notify()方法 Thread的sleep方法
(1)sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。
(2)wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
(3)wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)

7、sychronized与reentrantlock:
后者叫可重入锁,但其实两者都是同一个线程可重入的,都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁
前者是基于jvm实现的,后者是jdk实现的

(1)便利性:很明显Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。
(2)粒度和灵活度:synchronized方法级,ReenTrantLock优于Synchronized
(3)reentrantlock是在sychronized基础上提供更多功能:

1、公平非公平 ReenTrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁。
2、condition 分类唤醒该类全部。ReenTrantLock提供了一个Condition(条件)类,用来实现分组唤醒需要唤醒的线程们,而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。
 3、支持interupt。ReenTrantLock提供了一种能够中断等待锁的线程的机制,通过lock.lockInterruptibly()来实现这个机制。

Reentrantlock原理:实现是一种自旋锁,通过循环调用CAS操作来实现加锁,可以避免使线程进入内核台的阻塞状态

scheduler

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值