zoukankan      html  css  js  c++  java
  • 线程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)出来之后 到哪去了呢?

        锁池:直接返回就绪

        等待池:直接去锁池

  • 相关阅读:
    .NET XmlNavigator with Namespace
    编程要素
    【FOJ】1962 新击鼓传花游戏
    【POJ】1389 Area of Simple Polygons
    【POJ】2482 Stars in Your Window
    【HDU】3265 Posters
    【HDU】1199 Color the Ball
    【HDU】3642 Get The Treasury
    【HDU】4027 Can you answer these queries?
    【HDU】1542 Atlantis
  • 原文地址:https://www.cnblogs.com/trister/p/4749371.html
Copyright © 2011-2022 走看看