线程实现开启: 1.继承Thread,重写run方法,实例化后调用start方法,即会开启一个新的线程执行run里面的代码(实际上Thread是通过实现runnable) 2.实现Runnable接口,实现run方法,然后将该类实例化后放入Thread构造方法实例化一个Thraed对象,调用start方法开启一个线程
线程的五大状态: 1.新建状态 2.就绪状态 3.运行状态 4.阻塞状态 5.死亡状态
计算机的调度方式: 1.分时调度模型(平均分配每个线程占用CPU的时间片段) 2.抢占式调度模型(java虚拟机默认方式)(线程池里线程优先级高的先占用CPU,优先级相同时随机选择)
线程优先级:功能实现一定不能依赖于线程的优先级,而只能把线程优先级作为一种提高程序效率的手段 1~10 Thread有三个静态常量表示线程优先级:数值越大,优先级越高 1.MIN_PRIORITY = 1 2.NORM_PRIORITY = 5(默认) 3.MAX_PRIORITY = 10
线程休眠: 调用静态方法Thread.sleep(long millis)使正在执行的线程暂停,将CPU让给别的线程
线程让步: 调用静态方法Thread.yield()使当前线程让步,与sleep区别在于不会阻塞当前进程,它只是将线程转换成就绪状态; 当某个线程调用yield()后,只有与当前线程优先级相同或者更高的线程才有机会获得执行机会
线程插队: 调用Thread对象的join()方法(不是静态方法,需实例化调用),调用的线程将被阻塞,直到被join()方法加入的线程执行完毕后它才会继续执行,就算被加入的线程调用sleep()方法,也不会执行调用的线程;
线程同步:关键字synchronized 当多个线程使用同一个共享资源时,使用同步锁 1.同步代码块: synchronized(lock){ ........ } lock是一个锁对象,是同步代码块的关键,该对象可以是任意类型,但多线程共享的锁对象必须唯一,不能在run方法创建锁对象 2.同步方法:被修饰的方法在某一时刻只允许一个线程访问 synchronized 返回值类型 方法名(){} 锁对象是当前对象,即this;如果不创建对象,静态同步方法的锁对象则是class
死锁问题 都在等待对方的锁而不释放自己的锁
多线程通讯:三个方法都是void,需由锁对象调用 wait()使当前线程放弃同步锁并进入等待,直到其他线程进入此同步锁,并调用notify()或者notifyAll()方法唤醒该进程 notify()唤醒此同步锁上等待的第一个调用wait()方法的线程 notifyAll()唤醒此同步锁上调用wait()方法的所有线程