一、多线程 1.概念 指从软件或者硬件上实现多个线程并发执行的技术 2.并行 和 并发 1)并行:指两个或者多个事件在 同一时刻 发生(同时执行) 2)并发:指两个或者多个事件在 同一时间段内 发生(交替执行) 3.程序、进程、线程 1)程序:指一个指令的集合,安装的软件(一款app 2)进程:正在运行的程序 每一个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程 3)线程:进程中的一个执行单位,负责当前进程中程序的执行,一个进程中至少 包含一个线程 a.线程就是cpu调度的最小单位 b.单线程:一个进程如果只有一条执行路径,则称之为单线程 c.多线程:一个进程如果包含多条执行路径,则称之为多线程。 4.线程类(Thread) 1)创建线程的方式 a.继承方式:直接继承Thread类 b.实现步骤 ①自定义线程类,继承Thread public class MyThread extends Thread{} ②自定义线程类中重写run() @Override public void run(){ } ③创建线程对象 MyThread my1 = new MyThread(); ④start()寻找run()开启线程 my1.start(); b.注意:run()和start()的区别? Ⅰ.run():封装线程执行的代码,直接调用,相当于普通方法,无线程效果 Ⅱ.start():启动线程,由JVM调用该线程的run()执行 c.缺点:一个类只能有一个父类,当此类继承Thread,这个类只能是线程类,有局限性 2)实现方式:实现Runnable接口 a.实现步骤: ①自定义任务类,实现Runnable接口 public class MyRunnable implements Runnable ②在自定义任务类中,重写run() ③在测试类中,创建任务类对象 MyRunnable r1 = new MyRunnable(); ④通过任务类对象,构建线程对象 Thread t1 = new Thread(r1); Thread t2 = new Thread(new MyRunnable()); ⑤start()开启线程 b.优点:类出了可以实现Runnable接口,还可以继承其他类,和其他接口, 功能扩展性比较强,没有太多局限性 3)优化方式:使用匿名内部类继承Thread或实现Runnable a.匿名内部类结合Thread Thread t = new Thread(){ public void run(){ } } b.匿名内部类结合Runnable Runnable r = new Runnable(){ public void run(){ } } Thread t = new Thread(r); 2.常用方法 void setName(String name): 将此线程的名称更改为等于参数name String getName():返回此线程的名称 Thread currentThread(): 返回对当前正在执行的线程对象的引用 static void sleep(long millis): 使当前正在执行的线程停留(暂停执行)指定的毫秒数 final int getPriority():返回此线程的优先级 final void setPriority(int newPriority): 更改此线程的优先级线程默认优先级是5;线程优先级的范围是:1-10 void setDaemon(boolean on) 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出 注意:java中的垃圾回收机制(GC)就是守护线程 3.线程同步【线程安全】 1)前提条件:多个线程同时操作同一个资源 存在问题: 因为线程执行run(),不会一直执行,中间在任何地方都肯会中断. a.如果cpu重新分配时间片是原来的窗口,则继续往下执行 b.入股cpu重新分配时间片是新的窗口,则重投开始执行 解决方法:线程同步,给线程加锁 2)线程同步锁【synchronized】 实现线程同步的方式 a.同步代码块(synchronized) b.同步方法(synchronized) c.锁机制(lock) (1)同步代码块(synchronized) a.概念:synchronized关键词用于修饰方法中的某块区域,表示只对 这个区域的资源实行互斥访问。 b.格式定义 synchronized(同步锁/任意对象){ 需要执行同步操作的代码 } c.同步锁 ① 对象的同步锁只是一个概念,可以想像在对象上标记了一个锁 Ⅰ 锁对象:可以是任何类型 Ⅱ 多个线程对象:要是用同一把锁 (2)同步方法(synchronized) a.普通同步方法 ①格式 修饰符 synchronized 返回值类型 方法名(){} ②静态同步方法的锁对象: 类名.class (3)锁机制(Lock) a.创建方式:new ReentrantLock b.常用方法: void lock() :加锁 void unlock() :解锁