• 线程Thread


    一、线程:

      程序:保存在物理介质(光盘,软盘,硬盘)当中的代码片段

      进程:一旦程序运行起来,就变成了操作系统当中的一个进程

      线程:程序当中一条独立执行的线索

    二、线程的五大状态

      新生       就绪      运行      消亡

      Born            Runnable   Running        Dead

                阻塞

               Blocking

    三、如何实现线程:

    1.extends Thread 

      @Override

      public void run(){}

    2.implements Runnable 

      @Overrible

      public void run(){}

    3.implements java.util.concurrent.Callable

      @Override

      public String call()throws Exception{} 

    四、如何控制线程:

      0).setPriority(int);  设置优先级别:可选范围1-10,默认:5

      1).static sleep(long); 让当前线程休眠指定的毫秒数[涉及阻塞]

      2).static yield();    让当前线程放弃时间片直接返回就绪

      3).join()        一个线程邀请另一个线程优先执行,在被邀请的线程执行结束之前,邀请别人的线程不再执行,一直处于阻塞

      *:线程章节所有涉及到阻塞状态的方法,都需要进行异常处理~

      *:线程章节所有静态方法,不要关注谁调用方法,只要关注写在谁的线程体~

    五、线程中那些可能用到的方法:

      1.setName()  + getName();设置和得到线程名字

        *:让我们通过一个线程类,创建多个不同的线程对象

      2.static  activeCount() : 得到程序当中所有活跃线程的总数~

        *:什么叫活跃线程 :

            刚出生不会跑的 不叫活跃

            已经死了不能跑的 不叫活跃

            其他状态 都算活跃,所以:活跃 = 就绪 + 运行 + 阻塞         

      3.static  currentThread() : 得到正在运行状态的线程对象~

      4.setDaemon(true):设置线程成为守护线程

         所谓守护线程,就是给其他线程提供服务的线程,

         而守护线程最大的特点就是:当程序中只剩下守护线程的时候,守护线程自省结束~

      5.interrupt(): 中断  打断线程的阻塞状态

          例如:让一个线程去睡一个小时,睡了20分钟后,我后悔了~

    六、线程之间的数据共享:

      1)使用静态变量

       

      2)使用参数传递:

        

      3)使用内部类

        

    七、并发错误:

    多个线程共享数据的时候,很可能出现并发错误

    如何解决并发错误~

      *:临界资源 = 多个线程共享的数据

      *:java给每一个对象都提供了一个标记:

        所标记 = 互斥标记 = 互斥锁标记 = 锁旗标 = 监视器 = Monitor

      使用synchronized修饰符 = 同步的

        1).修饰代码块

          synchronized(临界资源){

            1st.;

            2nd;

            erd;      

          }

        *:小括号当中是要加锁的那个对象

           代表线程要拿到它的锁标记才能进入大括号当中执行操作

         如果拿不到,则进入这个对象的锁池当中阻塞,而离开大括号,需要归还临界资源的所标记,归还锁标记的操作会让锁池当中的线程返回就绪。

        2修饰整个方法

          public synchronized void add(){

          } 

          等价于

          public void add(){

            synchronized(this){

            }

          }

        从方法的第一行到最后一行统统进行加锁,对当前对象加锁

        *:当synchronized修饰静态方法的时候相当于对 .class 文件进行加锁

        *:方法的synchronized特性只有当前类型有效,无法被子类继承得到

        *:懒汉式的getter方法必须加synchronized

    八、如何解决死锁问题:

      *:最靠谱的是线程间相互"通讯"~

      Object 类的三个方法:

      1)wait():当前线程释放掉自己所有的锁标记和时间片

           并且进入调用方法的那个对象的等待池当中

      即:如果在 t1 线程当中出现stu.wait(); 就代表t1线程释放所有的锁标记和时间片

        并且进入stu对象的等待池当中  

      2)notify(): 从调用方法的那个对象的等待池当中随机的唤醒一个线程

      3)notifyAll():从调用方法的那个对象的等待池当中唤醒所有的线程~

      ****:这三个方法都必须在已经持有对象的锁标记的前提下才能调用~

         否则出现异常

        所以它们一定会出现在synchronized(abc){

                    abc.wait();//abc.notify();  

                  }

    九:锁池和线程池的区别:

      1)进入的时候 是否需要释放资源?

        锁池:不需要释放任何资源

        等待池:需要释放所有资源

      2)出来的时候 是否需要调用代码

        锁池:完全不需要

        等待池:必须有另一个线程notify();/notifyAll();

      3)出来之后 到哪去了呢?

        锁池:直接返回就绪

        等待池:直接去锁池

  • 相关阅读:
    使用submit异步提交,阻止表单默认提交
    EasyDarwin流媒体服务器实现关键帧推送功能
    EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器
    EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器
    EasyDarwin流媒体云平台架构
    EasyDarwin流媒体云平台架构
    EasyDarwin流媒体服务器高性能优化方向
    EasyDarwin流媒体服务器高性能优化方向
    我们将要建立的EasyDarwin开源社区
    我们将要建立的EasyDarwin开源社区
  • 原文地址:https://www.cnblogs.com/trister/p/4749371.html
Copyright © 2020-2023  润新知