多线程

一,多线程
  1,并发与并行
    并行:两个或两个以上的事件,同一时刻发生(同时进行)
    并发:两个或两个以上的事件,同一时间段内发生(交替进行)
  2,进程与线程
    进程:进入到内存中的应用程序、软件,这个过程叫做进程。
    线程:进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程,一个程序是可以有多个线程的,这个程序就可以称作多线程。
  3,主线程
    主线程:执行main方法的线程。
    单线程:程序执行从main方法开始,从上到下执行。
    原理:java程序进入内存,jvm先执行main方法,jvm会找操作系统开辟main方法---》通向CPU的路径,CPU就会通过这个路径main执行代码
  4,创建线程类
    概述:
      java.lang.Thread 类代表线程,所有的线程对象都必须是Thread的类或是其子类。
    创建步骤:
      1,继承Thread类
      2,重写run(); 方法
      3,创建Thread子类的实例,即使创建了线程对象
      4,调用 对象.start();方法
    获取线程名:
      1,Thread类中,有getName(); 返回该线程名称 String name
      2,获取当前正在执行的线程名称 currentThread();返回当前正在执行的线程对象,再通过 对象.getName(); 获取名称
    设置线程名:
      1,通过父类构造器,把名字String name传参到其中,super(name);
      2,通过 对象.set(name);方法
    休眠:
      sleep(long seconds); 执行的是线程休眠
  5,实现类接口方式创建线程
    概述:
      java.lang.Runnable 接口可通过被实现类实现方式,创建线程
    步骤:
      1,创建实现类实现Runnable接口
      2,重写run();方法----》方法中是新线程执行的代码
      3,创建Runnable实现类的对象
      4,创建Thread类对象,构造器中传参(Runnable实现类 对象)
      5,调用Thread类对象.start();方法,开启新的线程,执行run();
    作用:
      1,一个类如果继承Thread类,就不能继承其他类了
      2,一个类实现Runnable接口还可以继续继承其他类,提高可重用性
 
二,线程安全
  概述:
    如果有多个线程同时运行,而这些线程同时运行这段这段代码,如果程序运行的结果和单线程结果一样,而且运行的结果和预期效果也是一样的,我们成线程安全。否则,线程存在安全问题。
    当我们使用多个线程访问同一个源,并且多个线程中对资源有写的操作,就容易出现线程安全问题。
  解决:
    java中提供了同步来解决线程安全问题。 synchronized
  使用:
    1,同步代码块
      synchronized(锁对象){
        出现安全问题代码块
      }
      步骤:
        1》在成员位置创建 锁对象
        2》把锁对象添加到()中
        3》问题代码块添加到{ }中
      注意:
        1,创建的锁对象可以是任意对象,Object obj =new Object();
        2,必须保证多个线程使用的是同一个锁对象
        3,把{ }只让一个线程进
 
    2,同步方法
      步骤:
        1》创建一个方法,修饰符添加 synchronized
        2》把访问了共享数据的代码块放入该方法中
        3》调用方法
    3,Lock锁
      概述:
        Lock接口中,有lock();上锁 unlock();解锁的方法
      步骤:
        1》在成员位置创建Lock的实现类, ReentrantLock
        2》在可能会出现问题的代码前面, 调用 lock();方法加锁
        3》在可能会出现问题的代码后面,调用 unlock();方法解锁,释放锁
 
三,线程状态
  API中,java.lang.Thread.State 帮助手册
  概述:
    当线程被new 创建后,不是立即执行的,线程存在多种状态
    New         线程新建状态,但未被启动
    Runnable       可运行,在JVM里的状态
    Blocked       阻塞
    Waiting       无限等待,一个线程在等待另一个线程唤醒
    Timed_Waiting   计时等待
    Terminated     被终止,因run();结束,正常退出而死亡
原文地址:https://www.cnblogs.com/kide1412/p/10992966.html