码迷,mamicode.com
首页 > 编程语言 > 详细

线程总结

时间:2019-10-24 21:56:33      阅读:125      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!