2021-01-05

一、Java多线程和并发知识点(二)
1、Callable、Future与FutureTask
解决Runnable与Thread创建新的线程后,run()方法没有返回值的问题,称为异步模型。
Callable是只有一个抽象方法的函数式接口,有返回值,支持泛型;
在这里插入图片描述

Callable一般配合线程池工具ExecttorService来使用,ExecutorService可以使用submit方法来让一个Callable接口执行。其返回一个Future,后续程序可以通过这个Future的get方法获得结果;
在这里插入图片描述

注:如果不使用线程池,需要手动声明一个线程去包含这个future,并且执行。new thread(future).start();
Future接口中的方法:
在这里插入图片描述

Future接口的实现类FutureTask,提供了cancel,get,isDone等接口中方法的实现;
在这里插入图片描述

其中,future是线程池submit后获取的,futuretask是自己声明的;此外,futuretask能够在高并发环境下确保任务只执行一次;
2、线程组和线程优先级
每个线程必然存在于一个线程组当中。在声明线程时若没有显式指定,那么默认将父线程线程组设置为自己的线程组。通过线程组我们可以对线程进行批量控制;
java只是给操作系统一个优先级的参考值,线程最终在操作系统的优先级是多少还是由操作系统决定;使用setPriority()来进行设置;
高优先级的线程将会比低优先级的线程有更高的概率得到执行;
守护线程默认的优先级比较低;
线程的优先级是小于等于线程组的优先级,若是超过,则线程的优先级将会失效;
线程组统一异常处理:继承ThreadGroup并重新定义uncaughtException()方法;
3、JAVA线程的状态以及主要转化方法
a.Thread源码中state一共有6中状态:
在这里插入图片描述

NEW状态的线程此时尚未启动,这里的尚未启动指的是还没调用Thread实例的start方法;
反复调用同一个线程的start()方法或者是在一个线程执行完毕后再调用这个线程的start()方法
由于threadStatus的值不为0而抛出IllegalThreadStateException的错误;
RUNNABLE可运行状态的线程可能在JVM虚拟机中运行,也有可能在等待其他资源;
BLOCKED阻塞状态的线程正等待锁的释放进入同步区;
WAITING等待状态的线程变为RUNNABLE状态需要其他线程唤醒(notify、nitufyAll);释放锁
object.wait():线程处于等待状态直到另一个线程唤醒它;
thread.join():使现在执行的线程进入等待状态直到使用join方法的线程执行完毕;
Locksupport.park():除非获得调用许可,否则禁用当前线程进行线程调度;
TIMED_WAITING超时等待状态的线程会等待一个具体的时间,时间到后会被自动唤醒;
Tlhread.sleep(long millis):当前线程睡眠指定时间,不释放锁;
Object.wait(long timeout):线程休眠指定时间,期间可以唤醒;
Thread.join(long millis):等待当前线程最多执行millis毫秒,若值为0,则一直执行;
TERMINATED终止状态的线程已经完成代码的执行;
b.线程状态转换
在这里插入图片描述

Thread的start()方法只是告诉操作系统这个线程的状态是RUNNABLE,可以进行CPU时间片的抢夺;
在操作系统的专业术语中,因时间片用完而被剥夺CPU的情况被称为线程中断。但这与java中的中断线程不是一个概念。事实上,我们不可能通过应用程序来控制CPU的线程中断,除非我们能够自由调用OS的内核。中断可以理解为线程的一个标识位属性,表示一个运行中的线程是否被其他线程进行了中断操作。中断好比其他线程对该线程打了一个招呼,其他线程通过该线程的interrupt方法对其进行中断操作。中断操作不能直接终止一个线程,而是通知需要被中断的线程自行处理;
Thread.interrupt():中断线程。这里的中断线程并不会立即停止线程,而是设置线程的中断
状态为true;
Thread.interrupted():测试当前线程是否被中断。线程的中断状态都这个方法影响,意思
是连续调用两次会将冲段状态重新转为false;
Thread.isInterrupted():测试当前线程是否被中断,这个方法不会影响线程的中断状态;
4、JAVA线程间通信
a.锁与同步
线程同步是线程之间按照一定的顺序执行;
b.等待/通知机制
锁的方式需要线程不断地去尝试获得锁,会消耗服务器的资源。等待/通知机制基于object类的wait()方法和notify()方法来实现;
该机制需要两个线程使用同一个对象锁;
c.信号量:使用volatile关键字模拟信号量
d.管道
JDK提供了pipedWriter、pipedReader、pipedPutputStream、pipedInputStream,前面两个基于字符,后面两个基于字节流;
e.其他通信相关
join():让当前线程陷入等待状态,等join这个线程执行完成之后,再继续执行当前线程;
sleep():Thread类的一个静态方法,让当前线程睡眠一段时间,不会释放锁;
ThreadLocal:本地线程副本变量工具类,主要让每个线程都有属于自己的变量;
内部是一个弱引用的map,主要使用set()和get()方法来存储或获取本地变量值;
即使两个线程传入的是同一个ThreadLocal对象,不同线程的存储会有不同的结果;
私有变量与ThreadLocal的关系:当开发者希望将类的某个静态变量与线程状态关联,则可
以考虑使用ThreadLocal。最常见的使用场景为解决数据库连接、session管理等;
InheritableThreadLocal:不仅仅当前线程可以存取副本值,而且它的子线程也可以存取这个副本值;
二、JAVA内部类
1、内部类基础
成员内部类:
位于另一个类的内部,可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员);
内部类对象必须通过一个外部类的对象去创建,Outtr.Inner inner = outter.new Inner();
局部内部类:
局部内部类是定义在一个方法或者一个作用域里面的类,局部内部类的访问仅限于方法内或者该作用域内;
局部内部类相当于方法里面的一个局部变量,是不能有public、protected、private以及static修饰符的;
匿名内部类:
在实现父类或接口中的方法情况下同时产生一个相应的对象(在一个方法需要一个具体的对象的时候),但是前提是这个父类或者接口必须存在;
匿名内部类是唯一一种没有构造器的类;
静态内部类:
定义在另一个类中的带static的一个类,静态内部类不需要依赖外部类,不能使用外部类的非static成员变量或者方法;
三、ping命令详解
1、ICMP协议:ping命令是基于ICMP协议工作的
ICMP报文是封装在IP包里面,工作在网络层;
在这里插入图片描述

查询报文类型
回送消息:用于进行通信的主机或者路由之间,判断所发送的数据包是否已经成功到达对端
的一种消息,ping命令就是利用这个消息实现的;
回送应答:0;回送请求:8
在这里插入图片描述

差错报文类型
目标不可达消息(类型为3):IP路由器无法将IP数据包发送给目标地址,会给发送端主机返回
一个目标不可达的ICMP消息,并且在包头的代码字段显示不可达的具体原因;
原点抑制消息(类型4):路由器向低速线路发送数据时,其发送队列的缓存为0而无法发送出
去时,可以向IP包的源地址发送一个原点抑制消息从而使主机了解线路中发动拥堵,从而增加IP
包传输间隔,减少拥堵情况;
消息重定向(类型5):路由器发现端主机使用不是最优的路径发送数据,则会返回一个重定向
给主机,消息中包含最合适的路由信息和源数据;
超时消息(类型11):IP包中有一个字段叫做TTL,称为生命周期,它的值随着没经过一次路
由就会减1,直到减到0时该IP包会被丢弃,此次路由器会发送超时消息给端主机,通知该包已被
抛弃,主要是为了避免路由循环问题;
同一局域网内,ping命令后发生的事情:
在这里插入图片描述

四、ServletContext(二)
1、域对象功能:(存+取数据)——>实际上是一个map
setAttribute();getAttribute():removeAttribute();getAttributeNames();
2、对于JavaWeb而言,类路径就是webContent文件夹下的/WEB-INF/classes文件夹。WebContent文件夹外的文件最后都会被打包到classes文件夹下(src->com)
3、获取资源的相关方法(servletContext)
getRealPath("/文件名"):获取相对文件位置的绝对路径;
getResourceAsStream("/文件名"):将相应文件内容转换为数据流;
4、通过getInitParameter()方法获取由Web.xml中标签中定义的内容;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值