目录
28、多线程:
java程序中,所有线程的主类(线程中的run方法就是线程的主方法)都必须有严格的继承或实现要求,于是java中提供了三个主类的父类(接口):Thread父类、Runnable接口、Callable接口(JDK1.5之后推出)
注意:Callable是在JDK1.5之后推出的,是Java里并发编程技术(J.U.C)之中很重要的部分
(1)Thread类:
Thread.currentThread()获得当前正在运行线程的名称
如果使用线程主类直接调用run(),那么并不会产生多线程的效果,因为多线程的程序开发需要操作系统底层支持,所有的线程都需要通过JVM再向操作系统发出一些资源分配的指令之后才可以产生并发执行的效果。java设计中为了简化这一操作,所有的多线程都需要利用Thread类中的start()方法间接启动
(1)在start()方法底层实现中,主要有两部分:
第一部分:抛出了一个异常,这个异常继承自RuntimeException类所以不强制处理。触发条件:只有当一个线程启动了两次的时候才会抛异常,因为一个线程只能被启动一次
第二部分:start()方法中会调用一个start0()的方法,这个方法用native关键字修饰,并且没有方法体。这个方法是留给JVM底层实现的,这种技术叫做 JNI(java native interface) 技术:主要功能是直接进行底层操作系统函数的调用。这种技术更多的是用在安卓手机开发中
具体的多线程的启动的操作会由不同操作系统的JVM根据不同的操作系统动态的进行执行,而用户的代码不需要做出任何的变更,这样就可以实现代码的可移植性
(2)Runnable接口
这个接口是在JDK1.0的时候提供的,在JDK1.8之后支持了Lambda表达式,用户只需要实现该接口,覆写run()方法就可以实现线程主类的定义
注意:使用Runnable接口实现线程主类的定义,要想启动多线程,则必须使用Thread的构造(接收Runnable),然后再使用start()方法启动
(1)这是使用Runnable接口实现线程主类的处理结构:类似于代理设计模式,说类似的原因在于,代理设计模式中,代理类是直接调用核心方法,在核心方法中调用辅助方法进行处理
(2)使用Runnable接口可以实现数据共享,原理如下
注意:使用Thread类也可以,因为Thread类也是Runnable接口的子类,但是从结构上来说不合适
(3)Callable接口:
(4)java中的线程与进程:
(5)线程休眠:
线程进入阻塞状态
不管是哪种休眠方法,都存在有一个“InterruptedException”中断异常。这个异常是直接继承Exception,对于该异常,必须强制性进行异常处理。(只有当线程非正常结束时才会触发该异常)
(6)线程中断:
Thread中有一个静态方法interrupted,这个方法与isInterrupted的区别在于他在返回打断标记后会重置标记
使用此方法打断线程,不会影响线程的正常执行,但是会有一个线程被打断的标记
如果使用此方法打断sleep、wait、join中的线程,那么打断标记会被清空
在多线编程中,一个线程无法自己进行中断,必须依靠其他线程来完成这种中断处理
(7)线程强制执行:
在主线程中使用t1线程对象调用此方法,那么主方法将进入阻塞状态,直到t1线程执行完毕
底层是wait方法
(8)线程礼让:
这是一个静态方法,直接在线程的run方法中调用即可,线程会礼让一次。public static void yield();
线程会进入就绪状态
(9)线程优先级:
线程的优先级越高,线程就越有可能先执行。只是有可能
(10)线程同步:
java中要想利用锁处理机制来实现线程同步,有两种方法,同步代码块,以及同步方法。而这两种机制都会依赖于“synchronized”关键字
结论:多个线程更新同一资源的时候必须使用同步,而同步带来的问题就是线程的死锁
(1)同步代码块:
(2)同步方法:
同步方法指的就是在方法定义上追加synchronized关键字
(11)生产者与消费者:
(12)守护线程:
(13)volatile关键字:
注意:可以保证可见性,但是不保证线程安全(不是原子性),只适合于一个线程写,多个线程读的情况。可以解决指令重排问题(多线程下才会出现)
(14)syschronized:
此关键字加在普通方法上相当于锁住了this,加在静态方法上锁住的是类.class
29、字符串:
(1)StringBuffer类(JDK1.0)
注意:StringBuffer类底层使用了字节数组类保存数据,如果创建StringBuffer类时没有指定大小,那么默认是16的长度。如果超出长度内部会自动扩容,但是会产生垃圾。
(2)StringBuild类(JDK1.5)
(3)CharSwquence父接口(JDK1.4)
30、AutoCloseable接口(jDK1.7):
注意:要想实现自动关闭,则必须结合try catch结构