标签:target 为什么 泛型 接口 完成 集合 返回 参数 volatile
1.明确进程和线程的概念:
进程:
线程:
2.线程的特点:
并发性:
随机性:
通道性:
3.在java中只有Thread类代表线程
4.在java中使用线程的方式(在java中常见的创建线程的方式)
继承Thread类
实现Runnable接口
实现Callable接口
使用线程池
使用中间插件
4.1 继承Thread类
编写自定义类继承Thread类
创建自定义类的对象
把使用线程完成的业务代码编写到run方法中
调用Thread类的start方法,启动线程
4.2 实现Runnable接口
为什么要使用实现实现Runnable接口的方式创建线程?
如果自定义的类已经有了父类,则不能使用4.1的方式创建线程
使用实现Runnable接口实际上是把线程和要处理的业务功能解耦合(当需要线程给业务服务时,直接调用Thread(Runnable target))
Runnable接口中只有一个方法需要我们实现,就是 run 方法,需要把要使用线程服务的业务代码放入 run 方法
4.3 实现Callable接口
Callable接口中只有一个方法需要我们实现 ,就是 call 方法,需要把要使用线程的业务代码放入 call 方法
使用Runnable接口 和 Callable接口 完成多线程编程的区别是什么 ?
Runnable接口的 run 方法没有返回值 , Callable接口的 call 方法是有一个泛型的返回值
以上区别说明了如果线程服务的业务需要有返回值,请使用Callable接口,否则直接使用Runnable接口
4.4使用线程池
线程池 池化的概念
线程池就是把线程池化 ,提升系统的执行效率
Executors ExecutorService 使用线程池常用的类
常用的线程池类型:
newCachedThreadPool() 内存/缓存线程池
newFixedThreadPool(int nThreads) 固定线程池
newSingleThreadExecutor() 单一线程池
ExecutorService es = Executors.newSingleThreadExecutor() ;
es.submit(new Callable(){
public int call (){
.... 业务代码
}
});
到线程池这里,通常使用线程都是只关注业务方法,把业务代码编写Runnable接口的run 或者 Callable接口的 call 方法,
然后直接提交给线程池执行即可
5.java中的线程池是如何实现的?
java中的线程池的底层都是ThreadPoolExecutor实现的
newCachedThreadPool-new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>())
newFixedThreadPool-new ThreadPoolExecutor(nThreads,nThreads,0L
TimeUnit.MILLISECONDS,
new linkedBlockaingQueue<Runnable>())
newSingleThreadPool-new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new linkedBlockingQueue<Runnable>())
所有的常用的线程底层都是ThreadPoolExecutor对象,只是每个参数对象不同而已
6.线程状态
创建,就绪,运行,阻塞,死亡
7.多线程的安全问题
7.1什么是线程的安全性问题?
发生多线程安全问题的前提:
具有多线程环境
多个线程要有共享资源
每个线程处理共享资源的步骤都不是原子性的
以上3个前提同时满足,在某个时刻这个程序一定会发生安全性问题
7.2如何解决线程安全性问题
使用synchronized方式处理安全性问题
同步、异步
ThreadLocal 本地线程
volatile 改变了线程的内存执行方式
8.线程间通信
wait notify notifyall
lock
9.concurrent 并发包
这个包下边都是已经准备好的线程安全的类型或集合
对于非线程安全的类型可以使用包下的原子类型
eg:
AtomicBoolean 线程安全的布尔型
AtomicInteger 线程安全的整型
.......
线程安全的集合:
CopyOnWriteArrayList list
CopyOnWriteArraySet set
ConcurrentHashMap map
LinkedBlockingQueue queue
标签:target 为什么 泛型 接口 完成 集合 返回 参数 volatile
原文地址:https://www.cnblogs.com/sx66/p/11734912.html