【223天】黑马程序员27天视频学习笔记【Day25-中】

ellende 2019-06-21

叨叨两句

今天累P了,熬夜发个简单版,一定保证不断更
写的太简单过不了审核,晕死。。重新加点内容

25-04:两个线程间的通信

public class test {
    public static void main(String args) {
        final Printer p = new Printer();
        
        new Thread() {
            public void run() {
                while(true) {
                    p.print1();
                }
            }
        }.start();
        
        new Thread() {
            public void run() {
                while(true) {
                    p.print1();
                }
            }
        }.start();
    }
}

class Printer {
    private int flag = 1;
    public void print1() throws InterruptedException {
        synchronized(this) {
            if(flag != 1) {
                this.wait();
            }
            System.out.print("黑");
            System.out.print("马");
            System.out.print("程");
            System.out.print("序");
            System.out.print("员");
            System.out.print("\r\n");
            flag = 2;
            this.notify();
        }
    }
    
    public void print2() throws InterruptedException {
        synchronized(this) {
            if(flag != 2) {
                this.wait();
            }
            System.out.print("传");
            System.out.print("智");
            System.out.print("播");
            System.out.print("客");
            System.out.print("\r\n");
            flag = 1;
            this.notify();
        }
    }

}

25-05:三个或三个以上线程间的通信

  1. if语句的判断和while语句的判断区别:while是循环判断,而if不是。
  2. wait()语句在哪里等待,在哪里醒来
  3. 即便用notify唤醒了别的线程,当前线程也依然可能会有执行权。
  4. 控制台内容有限,内容太多会有部分内容被“顶”出去。

25-06:多线程间通信需要注意的问题

  1. 在同步代码块中,用哪个对象锁,就用哪个对象调用wait方法。
  2. 为什么wait方法和notify方法定义在Object类中?因为锁对象可以是任意对象
  3. sleep方法与wait方法的区别?

    1. sleep方法必须传入参数,参数就是时间,到时间自动醒来。不释放锁。
    2. wait方法参数可传可不传,传入就是在参数时间后结束等待,不传入参数就是不唤醒就不醒来。释放锁。

25-07: JDK1.5新特性互斥锁

  1. 同步

    1. 使用ReentrantLock类的lock和unlock方法替代synchronize方法
  2. 通信

    1. 使用ReentrantLock类的newCondition()方法可以获取Condition对象。
    2. 需要等待的时候使用Condition的await方法,唤醒的时候使用signal方法
    3. 不同的线程使用不同的Condition,这样就能区分唤醒的时候找哪个线程。

25-08:线程组的概述和使用

  1. Java中用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。
  2. 默认情况下,所有的线程都属于主线程组(main)

    1. public final ThreadGroup getThreadGroup()【通过线程对象获取他所属的组】
    2. public final String getName()//通过线程组对象获取他组的名字
  3. 我们也可以给线程设置分组

    1. ThreadGroup(String name)创建线程组对象并给其赋予名字。
    2. 创建线程对象
    3. Thread(ThreadGroup group,Runnable target,String name)
    4. 设置整组的优先级或者守护线程

25-09:线程的五种状态

  1. 新建、就绪、运行、阻塞、死亡
    【223天】黑马程序员27天视频学习笔记【Day25-中】

相关推荐