• 多线程学习1


    转载:http://www.cnblogs.com/xrq730/p/5060921.html

    1.多线程的作用:

      发挥多核CPU的优势;

      防止阻塞;(从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单      核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有      设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会      影响其它任务的执行。)

      便于建模;(这是另外一个没有这么明显的优点了。假设有一个大的任务A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。但是如果把这个大的任务A分解成几个      小任务,任务B、任务C、任务D,分别建立程序模型,并通过多线程分别运行这几个任务,那就简单很多了。)

    2.创建线程方式:

      继承Thread类

      实现Runnable接口

      肯定是后者好,因为实现接口的方式比继承类的方式更灵活,也能减少程序之间的耦合度,面向接口编程也是设计模式6大原则的核心。

    3.start()方法和run()方法的区别

        只有调用了start()方法,才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行。如果只是调用run()方法,那么代码还是同步执行的,必须  等待一个  线程的run ()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码。 多次调用start()方法,会报错                          (java.lang.IllegalThreadStateException,但不影响已启动的线程执行)。

    4.一个线程如果出现了运行时异常会怎么样

      如果这个异常没有被捕获的话,这个线程就停止执行了。另外重要的一点是:如果这个线程持有某个某个对象的监视器,那么这个对象监视器会被立即释放。

    5.sleep方法和wait方法有什么区别

        这个问题常问,sleep方法和wait方法都可以用来放弃CPU一定的时间,不同点在于如果线程持有某个对象的监视器,sleep方法不会放弃这个对象的监视器,  wait方法会放弃这个对象的监视器。

    6.生产者消费者模型的作用是什么

      (1)通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用。

      (2)解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系少,联系越少越可以独自发展而不需要收到相互的制约。

    7.为什么wait()方法和notify()/notifyAll()方法要在同步块中被调用

        这是JDK强制的,wait()方法和notify()/notifyAll()方法在调用前都必须先获得对象的锁。

        当前的线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒  来。然 后该线程将等到重新获得对监视器的所有权后才能继续执行。

    8.怎么检测一个线程是否持有对象监视器
        有方法可以判断某个线程是否持有对象监视器:Thread类提供了一个holdsLock(Object obj)方法,当且仅当对象obj的监视器被某条线程持有的时候才会返回true,注意  这是一个 static方法,这意味着"某条线程"指的是当前线程。

    9.synchronized和ReentrantLock的区别
        synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,这是二者的本质区别。既然ReentrantLock是类,那么它就提供了比synchronized更多更  灵活的特性, 可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上:

      (1)ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁

      (2)ReentrantLock可以获取各种锁的信息

      (3)ReentrantLock可以灵活地实现多路通知

      另外,二者的锁机制其实也是不一样的。ReentrantLock底层调用的是Unsafe的park方法加锁,synchronized操作的应该是对象头中mark word,这点我不能确定。



  • 相关阅读:
    蓝桥杯-带分数
    蓝桥杯-分红酒
    蓝桥杯-猜算式
    hdu2045不容易系列之(3)—— LELE的RPG难题
    蓝桥杯-奇怪的比赛
    linux应用之perl环境的安装(centos)
    linux应用之php开发环境lamp搭建(centos)
    linux应用之yum命令详解
    linux应用之用户管理相关命令
    linux应用之mysql数据库指定版本的yum安装(centos)
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/5331309.html
Copyright © 2020-2023  润新知