zoukankan      html  css  js  c++  java
  • 线程总结

    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

  • 相关阅读:
    leetcode之Search in Rotated Sorted Array
    leetcode之Search Insert Position2
    leetcode之Search Insert Position
    二分查找之Search for a Range
    leetcode之Two Sum
    leetcode之Spiral Matrix II
    leetcode之Spiral Matrix
    杨辉三角
    周计划1[7.22~7.28]
    英美音的比较
  • 原文地址:https://www.cnblogs.com/sx66/p/11734912.html
Copyright © 2011-2022 走看看