多线程:网络编程(理论)代码),软件服务器,软件工具
线程:Thread,Dos单任务操作系统,多任务操作。基于进程,一个进程就是一个应用程序,各自是独立的内存地址空间,
一个应用程序也可以同时(由CPU在之间完成切换完成的)执行多个任务,线程在进程内部独立执行的运行路径(一个线程就是一个运行工具,线程是共享内存空间
句柄:引用变量
在java运行的时候,java虚拟机就执行了多个线程,如主线程,gc,执行时CPU在多个线程进行切换
关系.
线程:切换成本低
并行运行如catch块中抛出异常与主线程就是并行的
实现多线程
Classmythread extends thead另一个继承runable接口
方法一:继承
方式二:实现runable接口,然后再把实现类对象传递给Thread对象,使用哪个根据场景区分
线程状态:分为5种状态
① 新建:new创建对象
② 就绪:调用start但start还未调用run
③ 运行:执行run方法
④ 运行中间可能有中断共5个原因:按频繁度:1. 运行中间没有抢到cpu。线程优先级共10级,默认5级,使用setpriority提升优先级,但10级并不是说一定会先执行,只是说抢占cpu的几率大,级别低的也可能抢到
2阻塞:由于I/O事件,线程被阻塞,如Scanner输入,print输出
3休眠:在thread有一个sleep方法,休眠,完成后才参与抢占资源
4等待唤醒:wait—notify(2个线程访问同一个资源,一个进入先让另一个等待,等做完了再notify唤醒另一个资源第一个资源,notifyall全部唤醒)
5挂起 yield强制性将线程拉出资源
⑤ 死亡:run方法执行结束
线程的安全性:StringBuffer和StringBuilder 如arraylist victor
Hashmap hashtable 都是线程同步不同
线程安全性问题:多个线程访问同一资源,会造成数据不统一,当多个线程访问时,就会采用同步,实际上就是对资源加了一把锁,先让一个线程做完,再进行下一个,效率就会变低
同步使用一个关键字:synchronized,第一种:在声明中,加上synchronized表示本方法是一个同步方法
第二种:将普通方法调用时采用同步块。所有方法均为同步方法:synchronized(rs){
rs.display;
}
死锁:当2个线程依赖于一对同步对象时就会发生锁死现象,依赖于wait,notify机制,这两个方法必须写在同步块里面(生产者与消费者问题)
网络编程:OSI模型,通信协议
OSI模型,开放系统互联模型,7层。实际使用TCP/IP四层模型
应用层,表示层,会话层,传输层,网络层,数据链接层,物理层顺序,在接受从下往上传
四层:应用层(遵守http协议),传输层(TCP:三次握手机制,保证传输的有效。另外一种UDP协议,安全性弱),网络互联层(IP协议,按协议的规定组合在一起寻址),网络接口层。
Socket:套接字实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。Socket编程
产生Socket对象,告诉ip地址:本机在网络上的ip地址,端口号:头有65535个端口,每一个端口针对一个应用,这些都是封装在协议中,交给谁去处理,作为发送方和接收方必须一致。接受同一端口号,在1024之前的端口号不能使用,如80端口浏览器,常见工具端口号不能使用,开发,一端是发消息的,一端是接消息
单例模式:书写一个类,该类能且只能产生一个对象
重写构造:结构体为private,外面new不到,加方法,public static getA()
Return属性为new A();
预加载模式:懒汉模式。
非预加载:在public static getA()里面写:
if a=null{
a=new A()
}
Return a;
延迟加载:饿汉模式,优势在于当真正需要a对象时才产生a对象,缺点是效率低。
双锁机制
Private A(){
}
Public static A getA(){
If(a==null){
Synchronized(this){//控制只能产生一个对象,只对第一次产生A对象同步,例外的A就跑掉了。
If(a==null){
A=newA();
}
}
}
}