跳过正文
  1. Posts/

JAVA编程进阶(3)

·381 字·2 分钟

等待唤醒机制和匿名内部类
#

等待唤醒机制
#

synchronized关键字
#

使用synchronized来实现并发


class DST{  //判断条件DST
    boolean A = false ;  //判断条件
}
class Thread_A extends Thread{
    private  DST dst ;

    public Thread_A(DST dst){
        this.dst = dst;
    }
    @Override
    public void run() {
        synchronized (dst) {

            if (dst.A == false) {
                for (int Time = 0; Time < 5; Time++) {
                    System.out.println("Thread_A: " + Time);
                }
            }
            dst.A = true;
            System.out.println("dst.A = true;");
        }
    }

}
class Thread_B extends Thread{
    private  DST dst ;

    public Thread_B(DST dst){
        this.dst = dst;
    }

    @Override
    public void run() {
        synchronized (dst) {
            if(dst.A == true) {
                for (int Time = 0; Time < 5; Time++) {
                    System.out.println("Thread_B: " + Time);
                }
            }

        }
    }

}

 public class DemoStudyThread {

    public static void main(String[] args) throws InterruptedException {
        
        DST dst = new DST();
        Thread_A thread_a = new Thread_A(dst);//同步DST
        Thread_B thread_b = new Thread_B(dst);

        thread_a.start();
        thread_b.start();


    }
}

输出结果:

Thread_A: 0
Thread_A: 1
Thread_A: 2
Thread_A: 3
Thread_A: 4
dst.A = true;
Thread_B: 0
Thread_B: 1
Thread_B: 2
Thread_B: 3
Thread_B: 4

wait()和notify()
#

  1. wait:线程不再活动,进入wait set中,不会浪费cpu,这时的状态就是waiting,必须等着另一个线程执行唤醒notify动作,把在waiting中的线程唤醒,这时waiting 中的线程从waiting set中释放出来。
  2. notify:从waiting set中选取一个线程释放,
  3. notifyAll:把waiting set中所有的线程唤醒。

注意事项:从waiting set中释放的线程并不代表可以立即恢复执行,只是进入可执行状态;


class DST{  //判断条件DST
    boolean A = false ;  //判断条件
}
class Thread_A extends Thread{
    private  DST dst ;

    public Thread_A(DST dst){
        this.dst = dst;
    }
    @Override
    public void run() {
        synchronized (dst) {
            if (dst.A == false) {
                    System.out.println("Thread_A");
            }
            dst.A = true;
        }
    }
}
class Thread_B extends Thread{
    private  DST dst ;
    public Thread_B(DST dst){
        this.dst = dst;
    }

    @Override
    public void run() {
        synchronized (dst) {

            if (dst.A == false) {  //在这里如果判断条件是false,线程B则会进入休眠
                try {

                    System.out.println("dst.wait();");
                    dst.wait();//如果为false,线程B则会休眠,后面的代码(测试代码A)将不会执行
                    System.out.println("Thread_B(Tst_A)");//测试代码A

                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

            }else {
                dst.notify();
                System.out.println("dst.notify();");
            }

        }

    }
}

 public class DemoStudyThread {


    public static void main(String[] args) throws InterruptedException {
        DST dst = new DST();
        Thread_A thread_a = new Thread_A(dst);//同步DST
        Thread_B thread_b = new Thread_B(dst);

        thread_a.start();
        thread_b.start();


    }
}

输出结果:

Thread_A
dst.notify();

注意事项:

  1. wait和notify方法必须要用同一个锁对象,锁对象只能唤醒同一个锁对象中等待的线程。
  2. 锁对象可以是任意对象。
  3. wait和notify方法必须要放在同步代码块或者同步方法中。

mbda创建匿名内部类

Lambda标准格式
#

由3部分组成,参数、箭头、代码。(参数类型 参数名称)->{代码语句}

利用匿名内部类创建线程
#

好处:可以省去实现类的定义,即不用再单独定义一个Runnable的实现类了。

public class DemoTest {
    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int Time = 0; Time < 3; Time ++) {
                    System.out.println("New Thread running: " + Time );
                }
            }
        }).start();

    }
}

输出结果:

New Thread running: 0
New Thread running: 1
New Thread running: 2
Xenolies
作者
Xenolies
Keep On Keeping On