异常与线程

java高级编程
    异常
        异常就是一个典型的抓抛模型
            流程就是在有问题的地方自动(手动)生成异常对象,并抛出,然后抓捕异常并处理。处理的方式有两种:1.把抓捕到的异常抛出去,谁调用该方法谁就去处理这个异常,可以说这种处理异常的方式并没有真正把异常处理掉运行的时候该出现异常还是会出现异常的,但他这样处理能不影响代码的整体运行。2.第二种是把抓捕到的异常直接处理掉,用try-catch-finally的方式去处理。这个处理的方式是一般是把错误信息输出到控制台上。真正想把异常处理掉其实是要根据这个异常提示信息(就是前面的try-cath-finally处理得出的信息),然会回到相应代码处修改代码才是真正把异常处理掉。如果没有前面这两种异常处理的方式,我们根本就不知道那里出错了,出错的原因是什么,是根本处理不了异常的。
    线程
        程序,进程,线程的理解
            程序是为了实现某种功能,用某种语言编写的一段静态的代码,静态对象。而进程是正在运行的一个程序,如运行中的qq,浏览器等等都是进程。而线程则是进程的一条执行路径,运行中的360是一个进程,里面的检查电脑,查杀病毒,清理垃圾都是线程,形象点说线程就是进程中的一项功能的执行。回归到一条执行路径的理解,就是你可以按这样去执行进程,也可以那样去执行进程,都是执行进程的一种方式,360就是,你可以用查杀病毒去执行360,你也可以用垃圾清理去执行360,而多线程就是,我多条路径同时执行,我即用查杀病毒去执行360,也用垃圾清理去执行360,等等,这就是多线程。
        线程的创建并使用
            这四种创建线程的方式核心都是启动线程(调用线程的start方法),重写run方法(这个线程具体是干什么的)。
                继承创建线程
                    1,2两种方式的对比的话,第二种有两个好处,第一个在处理是能更好的实现数据共享,第二个是打破了java单继承的局限性,让他不是继承了线程后就不能再继承其他类,没有其他功能了
                实现Runnable接口方式创建线程
                实现Callable接口方式创建线程
                    这个暂时不清楚好处在那
                用线程池创建线程
                    这个的好处的话是最明显的,因为线程都帮你造好了,能提高响应速率,而且不是造完就销毁,要用又重新造,他一直在线程池那里,要用就拿来用,这样就不用重复造线程了,降低资源消耗(这个好处是有点疑惑的,一直在那里不用不会一直占着资源吗?)。其实最大的好处是他能更好的管理线程,所有线程都在线程池里了,更好的根据需求实现线程的调度,管理线程
                    这个具体使用还不太明白,视频没讲清楚
        线程的生命周期
            新建,就绪,执行,阻塞,死亡,要清楚是什么方法导致对应线程生命状态的转变,总共就yield()方法,join()方法,sleep(),wait(),notify(),notifyAll()
        线程的同步机制(线程安全问题)
            为什么会出现线程安全问题?注意理解。结构卖票案例理解即可,那什么时候会出现线程安全问题呢?只有多线程同时处理共享数据的时候才会出现线程安全问题
                共享数据,同步监视器(锁)的理解
                    共享数据就是多个线程同时处理的共同的数据就是共享数据。至于同步监视器你就把他理解成一把锁,一个线程进去了,就上锁了,另一个线程就进去不了,这样就不会出现线程安全问题了。不过要注意一个重要点,多个线程必须共用的是同一把锁,如果不是,等于没锁,毫无效果。还有一个就是锁可以是任何类的对象充当。

                同步机制处理线程安全问题
                    同步方法
                        用sychronized关键字,然后同步方法处理的话,直接将这个关键字加在方法声明处即可,他会自动给你上锁的,默认是用this来充当锁,这个要小心,因为有时候这个锁不是唯一的,用继承创建线程的方式的话往往this就不是同一把锁,而用实现Runnable接口的方式创建线程,往往是唯一的,因为实现类只有一个,只有一个this,所以锁就是唯一的,如果不唯一那就用类.class来充当锁,类只加载一次,所以肯定是唯一的。
                    同步代码块
                        同步代码块处理线程安全问题的话就是sychronized关键字(锁){里面是操作共享数据的代码,不能包多了,也不能包少了,包多包少都会出现问题,重点是包的是操作共享数据的代码},然后注意这个锁是要唯一的,要多个线程共用同一把锁。这个与上面对比的话,上面更倾向于是刚好操作共享数据的代码完整的在一个方法中,没有多也没有少,就适合用上面这种,如果不是的话就适合用下面这种,灵活性高一定,想包那些代码就可以包那些代码。还有一点不同就是这个要手动上锁,不会帮你自动上锁的,但共同点是执行完包的那些代码后都会自动解锁。
                用java提供的Lock类的方法手动上锁和手动解锁去处理线程安全问题
                    对比上面的话只能说更灵活,因为需要手动上锁和手动解锁。其他对比暂时不清楚。使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有
更好的扩展性(提供更多的子类)
                使用优先顺序:Lock  同步代码块(已经进入了方法体,分配了相应资源)  同步方法
(在方法体之外)
        线程的通信
            主要是指线程与线程之间的交流,是你执行先还是我执行先,这个其实也是线程的调度问题,不过这个能完全实现线程的调度,主要通过wait(),notify(),notifyAll()方法实现
        线程的调度
            主要通过设置线程的优先级来调度,但其实不能完全调度起来,线程的优先级有三个,1,5,10。线程的优先级高只是意味着他抢占到cpu执行权的概率高,并不是他一定比低优先级的线程先执行,而且这个往往要大量的线程同时执行的时候效果才明显,毕竟是概率上的事,只有基数足够大效果才会有。对应两个方法setproitory,getproitory,设置线程优先级和获得线程优先级的方法
        对比笔记,缺少的点:并行并发的理解,线程的内存结构的理解,执行方法后会不会自动释放锁的方法总结,线程的常用方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值