多线程
来源:互联网 发布:黑马云计算大数据视频 编辑:程序博客网 时间:2024/06/06 18:32
创建线程的两种方式:
第一种是继承Thread类,它在执行过程中的内存结构图如下:
第二种是实现Runnable接口:
推荐的线程终止方式如下:
线程的调度与控制:
Java虚拟机要负责线程的调度,去的CPU的使用权。
目前有两种调度模式:分时调度模型、抢占式调度模型
分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU 的时间片
抢占式调度模型:优先级高的线程获取的CPU时间片相对多一些。如果线程的优先级相同,那么会随机选择一个
线程的优先级:
优先级:1~10
最低: 1
最高: 10
默认: 5
关于Thread类中的sleep方法:
① Thread.sleep(毫秒);
② sleep方法是一个静态方法;被调用时阻塞的是当前线程,不是调用该方法的那个线程引用阻塞。
③ 该方法的作用:阻塞当前线程,腾出CPU,让给其他线程
注意:Thread中的run方法不抛出异常,所以重写run方法时,在run方法的声明位置上不能使用throws。所以run方法中的异常只能try...catch...
关于线程同步:
实现同步的两种方法:
① 使用同步语句块
synchronized(共享对象){
需要同步的代码.....
同步块中只能有一个线程执行
}
② 同步方法
synchronized关键字添加到成员方法上,线程拿走的也是this的对象锁
两种方式对比:第一种方式控制的比较精细,只需将需要同步的代码放到同步代码块中;第二种方法是将整个方法同步,效率可能会更低。
守护线程:当所有的用户线程(上面我们说到的都是用户线程)结束生命周期,守护线程才会结束生命周期,只有有一个用户线程存在,那么守护线程就不会结束。例如 Java中的垃圾回收器。
public class DeadLock {public static void main(String[] args) {Object o1 = new Object();Object o2 = new Object();//两个线程共享数据Thread t1 = new Thread(new Thread1(o1, o2));Thread t2 = new Thread(new Thread2(o1, o2));t1.start();t2.start();}}//线程1class Thread1 implements Runnable{Object o1;Object o2;public Thread1(Object o1,Object o2) {// TODO Auto-generated constructor stubthis.o1 = o1;this.o2 = o2;}public void run() {// TODO Auto-generated method stubsynchronized (o1) {try {Thread.sleep(1000);//保证当次线程锁住o1时,第二个线程能锁住o2,从而发生死锁} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}synchronized (o2) {}}}}//线程2class Thread2 implements Runnable{Object o1;Object o2;public Thread2(Object o1,Object o2) {// TODO Auto-generated constructor stubthis.o1 = o1;this.o2 = o2;}@Overridepublic void run() {// TODO Auto-generated method stubsynchronized (o2) {try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}synchronized (o1) {}}}}