cpu执行资格:可以被cpu处理,在处理队列中排队
cpu执行权:正在被cpu处理
运行:具备着cpu执行资格和执行权
冻结:释放cpu执行资格权的同时释放cpu执行资格
临时阻塞状态:具备着cpu执行资格,但是不具备cpu执行权,正在等待着执行权
创建线程的第一种方式:继承Thread类,复写run方法
创建线程的第二种方式:实现Runnable接口,覆盖run方法,通过Thread类创建线程对象,并将Runnbale接口的子类对象作为构造方法的参数进行传递
通过start方法开启线程
实现Runnable接口的好处:
1)将线程的任务从线程的子类中分离出来,进行了单独封装,按照面向对象的思想将任务封装成对象
2)避免了java单继承的局限性
所以通过该方法创建线程更为常用
线程安全问题的原因:
1)多个线程在操作共享的数据
2)操作共享数据的线程代码有多条
当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会导致线程安全问题
同步:
同步好处:解决了线程的安全问题
同步弊端:相对降低了效率,因为同步外的线程都会判断同步锁
同步的前提:必须由多个线程并使用同一个锁
同步函数和同步代码块的区别:
同步函数的锁死固定的this
同步代码块的锁是任意的对象
静态同步函数使用的锁是该函数所属的字节码文件对象,可以用getClass获取,也可以用.Class获取
wait()和sleep()的区别:
wait():释放cpu执行权,释放锁;可以指定时间,也可以不指定
sleep():释放cpu执行权,不释放锁;必须指定时间
问题1:wait(),notify(),notifyAll()这些方法时操作线程的,为什么定义在了Object类中
1)这些方法存在于同步中
2)使用这些方法时必须要标识同步锁
3)同步锁可以使任意对象,而任意对象一定是Object的子类
问题2:为什么操作线程的方法,定义在了Object类中
因为这些方法时监视器方法,监视器其实就是锁;锁可以是任意对象,任意对象调用的方法一定定义在Object类中
jdk1.5以后的新特性:
1)将同步锁封装成了对象,并将操作锁的隐式方法定义在了该对象中,将隐式动作变成了显式动作
Lock lock=new ReentrantLock();lock.lock();lock,unLock();
2)出现了替代Object类中的wait和notify的方法,将这些监视器方法单独封装成condition对象,可以与任意锁组合
lock.newCondition();
3)守护线程:后台线程,如果前台线程生命已经结束,后台线程强制自行结束(无论是否处于冻结状态)
Thread t1=new Thread(); t1.setDaemon(true);将t1线程设为后台线程
4)联合线程:线程要申请加入进来运行,join也可以让线程处于冻结状态
临时加入一个线程运算时可以使用join方法。哪个线程执行到了join方法,哪个线程就释放cpu执行资格和执行权, 等调用join方法的线程执行完后再执行。
线程具有优先级,优先级越高,获得cpu执行权的机会就越大
优先级范围1-10;
MAX PRIORITY:高优先级 10
MIN PRIORITY:低优先级 0
NORM PRIORITY:默认优先级 5
可以通过setPriority方法设置优先级
interrupted 方法可以将线程从冻结状态恢复过来
yield方法,暂停,(暂时释放cpu,然后所有线程强cpu执行权),静态方法
转载自:多线程内容整理