• 大龄屌丝自学笔记Java零基础到菜鸟034


    Lock锁,死锁,线程组,线程池,定时器,练习题

    1、Lock锁(接口)

    lock();

    unlock();

    ReentrantLock是Lock的实现类。

    2、死锁

    同步的缺点:效率低,容易产生死锁。

    死锁:两个或两个以上的线程,在争夺资源的过程中,发生的一种相互等待的现象。

     1 public class MyLock {
     2     public static final Object objA=new Object();
     3     public static final Object objB=new Object();
     4 }
     5 
     6 public class DieLock extends Thread{
     7 
     8     private boolean flag;
     9 
    10     public DieLock(boolean flag){
    11         this.flag=flag;
    12     }
    13 
    14     @override
    15     public void run(){
    16         if(flag){
    17             synchronized(MyLock.objA){
    18                 System.out.println("if A");
    19                 synchronized(MyLock.objB){
    20                     System.out.println("if B");
    21     
    22                 }
    23             }
    24         }else{
    25             synchronized(MyLock.objB){
    26                 System.out.println("else B");
    27                 synchronzied(MyLock.objA){
    28                     System.out.println("else A");
    29                 }
    30             }
    31         }
    32     }
    33 }
    34 
    35 public class Fin{
    36     public static void main(String[] args){
    37         DieLock dieLock1=new DieLock(true);
    38         DieLock dieLock2=new DieLock(false);
    39         dieLock1.start();
    40         dieLock2.start();
    41     }
    42 }
    43 
    44 //死锁

    3、线程组

    ThreadGroup类,可以对一批线程进行分类管理。

    getThreadGroup();

    4、线程池

    Executros类,启动新线程成本太高,可以利用献线程池提高线程使用效率(用完后回收)。

    newCachedThreadPool();

    newFixedThreadPool();

    newSingleThreadExecutor();

    以上三个方法的返回值为ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或Callable对象代表的线程。

    submit();

    shutdown();

    5、定时器

    Timer类:schedule();

    TimerTask类:run(); , cancel();

    6、练习题

    (1)多线程有哪几种实现方式?

    三种:继承Thread类,实现Runnable接口,实现Callable接口(结合线程池使用)。

    (2)同步有哪几种实现方式?

    两种:同步代码块,同步方法。

    (3)启动一个线程是run()还是start(),两者的区别是什么?

    start()。

    run():封装了被线程执行的代码,直接调用,相当于普通方法的调用。

    start():启动线程,并由JVM自动调用run()方法。

    (4)sleep()和wait()的区别是什么?

    sleep():必须指定时间;不释放锁。

    wait():可以指定时间,也可以不指定时间;释放锁。

    (5)为什么wait()、notify()、notifyAll()都定义在Object类中?

    因为这些方法的调用,依赖于锁对象,而同步代码块的锁是任意锁,所以定义在可以代表任意对象的Object类中。

  • 相关阅读:
    IntelliJ IDEA使用心得之问题篇;
    IntelliJ IDEA使用心得之Maven项目篇
    IntelliJ IDEA使用心得之非Maven项目篇
    IntelliJ IDEA使用心得之插件篇
    IntelliJ IDEA使用心得之快捷键篇
    新博客地址
    【转载】Dijkstra算法和Floyd算法的正确性证明
    【转载】最小生成树之Kruskal算法
    论自动AC机
    【转载】C++ STL priority_queue用法
  • 原文地址:https://www.cnblogs.com/liverpool/p/4875593.html
Copyright © 2020-2023  润新知