zoukankan      html  css  js  c++  java
  • 线程

    1:什么是线程

      线程是app中的一个任务(顺序执行流)

      进程是操作系统的一个任务,开辟了一个独立的内存空间,一个app占用一个进程,一个app中有一个或多个线程。这些线程可以共享这块内存空间的资源。

    2:并发

      在计算机中,围观上,多个线程不是同时进行的,而是断断续续的(cpu把时间段分成无数多个小的时间片段,而在一个时间片段中,cpu只能运行一个线程,其他线程处于阻塞状态),而宏观上,看上去像是“同时发生”的,这种情况叫并发。

      并发的优点:提高运行效率

         缺点:有安全隐患

    3:线程的状态

          new

           |

           |-start()

           |

          runnable

           |

    wait sleep   |

          running

           |

          over

    4:线程的创建

      (1)继承Thread类,重写run方法(run方法的作用就是写任务代码)

      (2)实现Runnable接口,重写run方法。还要把Runnable的子类型传入Thread对象中,由Thread对象负责启动线程。

      (3)使用匿名内部类完成线程的创建

    5:main方法,是jvm调用的执行程序的入口,也是一个线程。

    6:线程的常用API

      (1)getName();获取线程的名称(系统会给每一个线程默认分配个名称)

      (2)getId();获取线程的ID值(系统会给每一个线程分配一个标识符)

      (3)currentThread();是静态方法,获取当前所处的线程

      (4)sleep(long time);静态方法,使当前线程进入阻塞状态多少毫秒(让出时间片段),超出time时间,自动进入runnable状态,在time时间内,可能会被打断,会出现打断异常。

      (5)interrupt();打断线程(谁调用,谁就会被打断)线程只有处在睡眠状态时,才会被打断。

      (6)yield();使线程回到runnable状态,让出当前的时间片段。

      (7)join();线程同步

    7:线程安全问题

      当多个线程同时访问某一处资源时,会发生线程安全问题。

      这类资源可以是(1)静态资源(2)实例属性

      我们应该让多个线程异步访问这个资源变成同步访问这个资源。

      异步:多个线程“同时运行”,自己干自己的。

      同步:多个线程要按照顺序,一个访问完,另一个才能访问。

      

      锁机制:关键字synchronized(同步),java语言可以为某一块代码提供一个内置锁。

      格式:synchronized(锁对象){
           代码块

         }

      当某一个线程执行到此代码时,会获取一个内置锁,将此代码从里面上锁,其他线程碰到此代码时,需要等待正在运行的线程运行完这个代码块后(会释放内置锁),才可以获取内置锁对象。

      锁:java的任何对象都可以作为锁对象,但是必须保证多个线程使用的是同一个锁,如果锁不是同一个,那么解决不了线程安全问题。

      可以对方法进行直接加锁机制,有锁,锁是类对象(获取类对象的方法:类名.class,类对象是唯一的)。

      在使用锁机制时,要主要效率,锁入的代码越少效率越高。

      静态方法和动态方法在使用锁机制时,不互斥(不会影响)。

      静态方法的锁对象时类对象。

      动态方法的锁是对象。

    8:wait()/notify():作用是协调多线程的工作。

      举例说明:一个线程的运行可以会跟另外一个线程有关系,关系如:线程A要等线程B运行完才可以运行。线程A中要使用锁对象.wait()表示等待(让出cpu片段),线程B运行完时,需要锁对象.notify()通知线程A,可以运行了。

  • 相关阅读:
    操作系统
    MarkDown语法实操
    mac 添加环境变量
    在django中建立mysql数据表时发生的低级错误
    models.Book.object.get()与models.Book.object.filter()区别
    django中数据库操作时distinct的用法
    ‘,’逗号并不是字符串的拼接方式
    django单表操作中update_or_create不能更新多于一个数据的信息
    在python中terminal中建立mysql数据库,无法再models.py 文件中建立数据库信息
    booleanfield()和booleanfield(default=True)在数据库的表中无法插入
  • 原文地址:https://www.cnblogs.com/lyr999736/p/9155523.html
Copyright © 2011-2022 走看看