JAVA多线程(三)

版权声明:转载请注明来源! https://blog.csdn.net/qq_19595957/article/details/85160445


用到的代码后面会添加上去,如果急需要的话,评论留下邮箱

线程优先级

(1)每个线程都有优先级,优先级越高,获得CPU资源的机会越大,只是机会变大了,不是一定就能获取到
(2)线程优先级范围:1-10
(3)主线程默认优先级:5
(4)自定义线程:默认优先级:自定义的线程优先级跟启动这个线程的一样
(5)设置 & 获取优先级方法

public final void setPriority(int newPriority)
public final int getPriority()

用户线程与守护线程

(1)用户线程
主线程默认:用户线程,不能修改其为守护线程

(2)守护线程

  1. 每个线程都可以设置为守护线程,也可以设置为不是守护线程
  2. 特点:
    ①守护线程可以看做是用户线程保姆,是为用户线程服务的
    ②自定义线程是否是守护线程和启动它的线程默认一样
    ③所有用户线程都挂了,守护线程就没有必要工作了,就会死亡,当然不一定立即死亡,有可能要处理后事。
  3. 注意:要修改其是否是守护线程,不能在就绪状态及其以后的状态修改
  4. 设置 & 判断是否是守护线程 方法
public final void setDaemon(boolean on)
public final boolean isDaemon()

线程同步

(1)为什么要线程同步?
多线程环境下,多个线程对象访问一个数据会出现线程安全问题
案例:卖票
出现了重复的票和负数的票

(2)线程同步方式

  1. 同步代码块
  • 一块代码{}只能一个线程执行完毕后,其他线程才能跑。
    语法:synchronize(同步监听对象){
    需要被同步的代码(有线程安全问题的代码)
    }

  • 同步监听对象:
       ①相关线程之间一定要保证同步监听对象是同一个
       ②静态同步代码块默认的监听对象是this
       ③类名.class:字节码对象,有且只有一份

  1. 继承Thread
    (1)同步监听对象只能使用类名.class
    (2)如果是使用的一个对象也可以是this——案例:存钱-取钱-存钱-取钱
  2. 实现Runnable接口
    可以是this, newObject()…, 类名.class
    2、同步方法
    语法:
    在方法签名中的返回值之前加入synchronized,例:
    synchronized private static void main(param){
    }
    监听对象:
       ①同步方法不需要写同步监听对象,实例方法(非static修饰)默认同步监听对象是this;
       ②同步方法不需要写同步监听对象,静态方法(有static修饰)默认同步监听对象是当前类所在的字节码对象 Xxx.class;

注意事项:
   ①继承模式下某方法又调用自己类成员方法,不能使用同步方法
   ②实现模式下,直接加synchronized就可以了

  1. 锁机制
    ReentrantLock

线程通信

主要两个方法:
(1)wait() 等待
(2)notify() 唤醒该同步监听对象上面线程

猜你喜欢

转载自blog.csdn.net/qq_19595957/article/details/85160445