java多线程入门知识——复习用

jdk1.4以及之前版本

一java多线程的调用的注意事项

       start方法以新进程自动调用run方法

      直接调用run方法是串行执行

       同一线程start方法只能调用一次

      多线程启动的先后顺序是随机的

一   多线程的实现(两种方法)

      1  继承Thread类

           成员变量不共享  

      2 实现Runnable接口

         成员变量可以共享(工作缓存副本问题导致粗粒度)

      3 实现Callable接口(与Runnable接口类似)

          Runable的run方法没有返回值,Callable的call方法有返回值。

二  多线程的信息共享问题

         通过static关键词修饰变量(工作缓存副本问题导致粗粒度)

         volatile关键字来修饰变量,保证不同线程操作的可见性(细粒度)

         关键步骤用synchronized关键字进行互斥加锁限制,使只能一个线程进入

三 线程状态

 new 刚创建(new)

runnable 就绪态(start)

running 运行中(run)

block 阻塞 (sleep)

terminated 结束

四     线程阻塞和唤醒

         sleep 时间一到,自己醒来

         wait/notify/notifyAll 等待,被动的需要别人唤醒(不推荐:与线程主动暂停或终止相比,被动不能够及时的释放资源,主                                           动的可以先释放资源,再主动动作)

         join 等待另一个线程结束

        interrupt 像另外一个线程发送中断信号,线程收到信号后触发interruptedException,并进行下一步处理。

五   

        预防多线程死锁——每个线程互相持有别人需要的锁(哲学家圆桌吃面)

        解决方法 规定资源的获取顺序。

六    守护线程

         setDaemon函数

         随着run方法运行结束或者main方法结束而结束。

        不要访问资源或加载一些锁(随着main函数的结束被动终止,来不及释放资源)

7      ThreadGroup 线程组管理

       线程组是线程的集合

       大线程组可以包括小线程组

        enumerate方法可以遍历组内的线程,执行操作

        管理效率低,无法重用线程

二 多线程框架管理

         

       Executor框架

          Executors.newCachedThreadPool(无界线程池,自动线程回收)

          Executors.newFixedThreadPool(固定大小的线程池)

          Callable接口等价于Runable,Runable的run方法没有返回值,Callable的call方法有返回值。

          Future返回结果

       Fork-join框架

          适用于整体任务量不好确定,但最小任务数可以确定的场景,线程池数量不确定的情况

          关键类:

          ForkJoinPool(任务池)

java数据结构

        list

        vector 同步安全 写多读少

        arraylist 不安全

        Collections.synchronizedList(List list)基于synchronized,效率差

        CopyOnWriteArraylist 读多写少,基于复制机制,非阻塞

       set

        hashset 不安全

        Collections.synchronizedset(Set set)基于synchronized,效率差

        CopyOnWriteArraySet 基于CopyOnWriteArraylist 读多写少,基于复制机制,非阻塞

       map

        Hashtable 同步安全 写多读少

        HashMap 不安全

        Collections.synchronizedmap(Map map)基于synchronized,效率差

       ConcurrentHashmap 读多写少 非阻塞

      queue

        ConcurrentLinkedQueue 非阻塞

       ArrayBlockingQueue 阻塞

线程控制

        Lock函数

        trylock 预判锁是否空闲

        ReentrantLock类,可重入的互斥锁

         ReentrantReadWriteLock类,可重入的读写锁

         Unlock函数

      Semaphore(信号量计数器),可以设置并发访问量 (马路道)

         大于0可以使用,等于0不能使用

          acquire获取

          release释放

        Latch(插销),等待锁,用来同步一个或多个线程,不保护临界区或共享资源

         Countdownlunch

        CountDown()计数减1

        await() 等待latch变成0

       Barrier 集合点 允许多个线程在同一点进行同步

        cyclic

        构造函数是需要同步的线程数量

        await 等待其他线程,到达数量后就放行

        phaser 当所用线程到达这步,再进行下步

          arrive()

          arriveandawaitadvance()

        exchanger 互换消息 两个线程定义同步点,都到达时互换数据

         

         

   

猜你喜欢

转载自blog.csdn.net/qq_44665418/article/details/107009088
今日推荐