首页 > 技术文章 > Java多线程(二)

kingofjava 2019-04-24 12:27 原文

1. synchronized关键字

   利用此关键字可以定义同步方法或同步代码块,在同步代码块的操作里面只允许一个线程执行

A.利用同步代码块进行处理

    synchronized(同步对象){

       同步代码操作;

    }

    一般进行同步对象处理的时候可以采用当前 线程主体.class

B.利用同步方法进行处理:

    只需要在方法上定义synchronized关键字即可

C. Lock接口解决线程同步问题:

    void lock()  获得锁;   void unlock()  释放锁

    在同步代码前加锁lock(),执行完毕后释放锁unlock()

    ReentrantLock类是Lock接口的子类

通过实例化ReentrantLock类调用 lock()  获得锁   void unlock()  释放锁

    示例:

       class X {

          private final ReentrantLock lock = new ReentrantLock();

             // ...

          public void m() {

              lock.lock();  // block until condition holds

             try {

             // ... method body

             } finally {

                lock.unlock()

             }

          }

      }

注意事项: 1 继承Thread用静态(Static)  private static ReentrantLock lock = new ReentrantLock();

         2 实现Runnable接口可以不用静态锁,当然用也没问题

2.线程优先级

线程优先级:

    理论上讲线程优先级越高越有可能先执行(越有可能抢占到资源)

    Thread类针对优先级的操作有如下方法:

      设置优先级:public final void setPriority(int newPriority);

       获取优先级:public final int getPriority();

在进行优先级定义的时候是通过int型数字来完成的,而对于此数字的选择在Thread类中定义有三个常量:

       最高优先级:public static final int MAX_PRIORITY = 10;

       中等优先级:public static final int NORM_PRIORITY = 5;

       最低优先级:public static final int MIN_PRIORITY = 1;

3.线程守护

   主线程的程序或其他线程还在执行的时候,守护线程将一直存在,并在后台运行

   主线程执行完毕,守护线程就不再执行

    设置为守护线程:public final void setDaemon(boolean on);

    判断是否为守护线程:public final boolean isDaemon();

4.  线程等待与唤醒

等待与唤醒的操作机制主要依靠Object类提供的方法处理:

    等待机制:

|-死等:public final void wait()throws InterruptedException;

       |-设置等待时间:public final void wait(long timeout)throws InterruptedException;

       |-设置等待时间:public final void wait(long timeout, int nanos)throws InterruptedException;

       唤醒第一个等待的线程:public final void notify();

       唤醒全部等待的线程:public final void notifyAll();

   使用当前对象调用等待与唤醒方法

推荐阅读