• 02.线程的等待与中断


    public class NotifyDemo {
        //创建资源
        private static volatile Object reA = new Object();
        private static volatile Object reB = new Object();
        //创建线程
        public static void main(String[] args) throws InterruptedException{
            Thread threadA = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //获取reA共享资源的监视器锁
                        synchronized (reA){
                            System.out.println("threadA get reA lock");
                            //获取reB共享资源的监视器锁
                            synchronized (reB){
                                System.out.println("threadA get reB lock");
                                System.out.println("threadA release resourceA lock");
                                //当线程调用共享对象的wait()方法时,当前线程只会释放当前共享对象的锁
                                reA.wait();
                            }
                        }
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            });
            Thread threadB = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(1000);
                        //获取reA共享资源的监视器锁
                        synchronized (reA){
                            System.out.println("threadB get reA lock");
                            //获取reB共享资源的监视器锁
                            synchronized (reB){
                                System.out.println("threadB get reB lock");
                                System.out.println("threadB release resourceA lock");
                                reA.wait();
                            }
                        }
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            });
            threadA.start();
            threadB.start();
            //等待两个线程结束
            threadA.join();
            threadB.join();
    
            //threadA get reA lock
            //threadA get reB lock
            //threadA release resourceA lock
            //threadB get reA lock
        }
    }
    
    /**
     *  threadA 调用共享对象 obj 的 wait()方法后阻塞挂起了自己,然后 主线程在休眠 ls 后中断了 threadA 线程,
     *  中断后 threadA 在 obj.wait()处抛出 java.lang. InterruptedException 异常而返回并终止。
     */
    public class NotifyDemo2 {
        //创建资源
        private static Object obj = new Object();
        //创建线程
        public static void main(String[] args) throws InterruptedException{
            Thread threadA = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //获取reA共享资源的监视器锁
                        synchronized (obj){
                            System.out.println("begin");
                            obj.wait();
                        }
                        System.out.println("begin");
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            });
    
            threadA.start();
            Thread.sleep(1000);
            System.out.println("begin interrupt");
            threadA.interrupt();//中断threadA线程
            System.out.println("end interrupt");
            //begin
            //begin interrupt
            //end interrupt
            //java.lang.InterruptedException
            //	at java.base/java.lang.Object.wait(Native Method)
            //	at java.base/java.lang.Object.wait(Object.java:516)
            //	at com.fly.NotifyDemo2$1.run(NotifyDemo2.java:15)
            //	at java.base/java.lang.Thread.run(Thread.java:844)
        }
    }
    
  • 相关阅读:
    最近在学习vala,并打算用它写点东西, 先上个习作 -- popplersample
    GTK# 学习笔记
    monodevelop2.0在SmartQ5上成功运行
    c, cs, vala 性能简单测试
    在Q5上用vala写程序
    树结构型数据在基于关系型数据库的分布式应用的解决方案
    常用常忘的delegate,记一下。
    JSON
    HTML5脚本编程
    event事件对象
  • 原文地址:https://www.cnblogs.com/fly-book/p/11358423.html
Copyright © 2020-2023  润新知