📄 复习6.txt
字号:
java.net
通讯所用的协议:
1、tcp/ip:有会话,有交互,一般是点对点的通信,稳定,保证质量,
但速度慢,所耗资源大。
tcp/ip--->ftp
--->http-->soap
--->smtp
一、实现
服务端
--实例化说明公开的端口
ServerSocket ss=new ServerSocket(4001);
--监听,当接收到一个请求后,产生个会话
Socket socket=ss.accept();
--得到输入的信息
socket.getInputStream();
--向服务端打印信息
socket.getOutputStream();
客户端:
Socket client=new Socket(服务器主机名/ip,端口);
//得到输入流
client.getInputStream();
//得到输出流
client.getOutputSteam();
--客户端通过键盘输入信息发给服务端,服务接收信息
将结果返回给客户端,客户端接收信息打印。
2、udp:没有会话,没有交互,不管另一方是否准备好都进行,是广播式,
可以群发,不稳定、不能保证质量,但速度快,所耗资源小。
核心类:
DatagramSocket:发送信息
send(DatagramPackage dp):发送信息
receive(DatagramPackage dp):接收信息
DatagramPackage:封装信息
1、发送信息要说明对方的ip及端口
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
3、接收时要预留空间。
DatagramPacket(byte[] buf, int offset, int length)
线程
一、线程与进程的比较
1、共同点
并发
2、不同点
进程:
有独立的内存空间
进程间的通信需要的资源大
线程:
进程内的并发,进程内的并发是由线程决定的。
线程没有独的内存空间而是共享进程的内存
线程间的通信占用资源较小。
二、线程的实现(*****):继承Thread或实现Runnable接口,覆盖run方法,
必须通过start()启动,
调用run方法运行线程。
如果不是start()就不会启动新线程,
而是调用一个对象的方法,没有新线程,
没有并发。
public class MyThread extends Thread
{
public void run()
{
}
public static void main(String[] args)
{
MyThread my=new MyThread();
my.start();
}
}
public class MyThread implements Runnable
{
public void run()
{
}
public static void main(String[] args)
{
MyThread my=new MyThread();
Thread t=new Thread(my);
t.start();
}
}
三、线程同步(*****):一个对象的同步方法被一个线程调用,
另一个线程调用该对象的当前方法
或其它同步方法时,只能等待,
调用非同步方法不受限。
注意事项:
1、只有一个对象
2、有多个线程
代码:
类级的实现
public class CommObject
{
//同步方法
public synchronized void a1()
{
}
//非同步方法
public void a1()
{
}
}
对象级的实现,类中的方法没有加synchronized关键,而是通过同步块说明同步。
public class CommObject
{
//非同步方法
public void a1()
{
}
//非同步方法
public void a2()
{
}
public static void main(String[] args)
{
CommObject com=new CommObject();
//对象同步方法
synchronized(com)
{
com.a1();
com.a2();
}
}
}
四、实现多线程服务框架(****):两个线程一个类。
1、监听器线程:监听客户的连接请求产生一个会话。
public class Listener extends Thread
{
private ServervSocket ss;
private Socket socket;
public void run()
{
ss=new ServerSocket(4001);
while(true)
{
socket=ss.accept();
Connection con=new Connection(socket.getInputStream(),socket.getOutputStream());
//运行会话线程,会话线程与监听线程并发运行,会话线程结束后
//监听线程继续执行
con.start();
}
}
}
2、会话线程:
其由监听器产生,并脱离监听器线程独立运行,调用会话线程。
如果监听器线程停止了,不影响会话线程。
public class Connection extends Thread
{
private InputStream input;
private OutputStream output;
private Server server;
public Connection(InputStream input,OutputStream output)
{
this.input=input;
this.output=output;
server=new Reverse();
}
public void run()
{
this.server.server(this.input,this.output);
}
}
3、服务类:由会话线程调用,做具体的服务
public interface Server
{
public void server(InputStream input,OutputStream output);
}
public class Reverse implements Servler
{
public void server(InputStream input,OutputStream output)
{
BufferedReader br=new BufferedReader(new InputStreamReader(intput));
PrintStream ps=new PrintStream(output);
while(true)
{
ps.println("请输入信息");
br.readLine();
}
}
}
七、线程的生命周期(*****)
就绪:实例化一个结程
启动:通过start方法启动线程,与主线程并发运行
运行:调用run方法
休眠:sleep()
等待:wait()
激活:notify()
yield:将当前线程放到要执行线程队列最后。
挂起:suspend()
恢复:resume()
销毁:
stop:有垃圾的清理工作
destroy:没有垃圾清理工作
八、sleep与wait的区别
sleep:
可以在同步中执行,也可不在同步块中执行。
确定休眠多长时间,自动醒来。
wait:
必须在同步块中执行
什么时间醒来不清楚,只有通过外部类调用notify方法之后才可以醒来的。
九、join(****):主线程等待所有的子线程执行结束后再结束
线程实例.join();
十、daemon(****):守护线程,JVM就是一个守护线程
在方法调用之前设置
为非守护线程提供服务,当所有非守护线程结束后,
不管其是否运行完毕都会自动结束。
由一个守护线程产生的新线程也是守护线程
十一、ThreadGroup(***):线程组,管理多个线程
任何一个线程都在一个线程组中,
线程组下可以有子线程组及线程。
getParentGroup:得到父线程组
currentThread:得到当前线程
getThreadGroup:得到当前线程所在的线程组
new Thread(所属线程组,Runnable,name)
new Thread(Runnable)
new ThreadGroup(线程组,线程组名)
遍历线程组下的所有线程
十二、 setPriority(***):(1--10)一般情况下优先级高的先执行。
默认是5
最大是10
二、线程池(***):系统启动每一个线程要占用较多时间,
所以我们可以用线程池,在池中预放n个线程,
用时取出,不用时可以还回去。
三、基于线程的时间管理(**)
TimerTask:过一段时间可以启动的线程,必须继承于该线程
Timer:
Timer timer=new Timer();
timer的schedule方法:
1、过多长时间执行线程。
Timer(myTask2, 300)
2、过多长时间执行线程,每500秒重新执行一次
Timer(myTask2, 300, 500)
3、Timer(myTask3, date):什么时间后执行一次线程
cancel方法:终止定时器:
Timer.cancel();
四、线程实现死锁(*****)
一个线程占用一个资源再去占用另一个线程正在使用的资源。
集合
作用:是可以存储一批类型不同的对象,针对集合的实现类有很多,作用都是一样的
即存储、传输数据,但存储的数据结构不一样,其速度、安全性也不一样。
集合框架的组成:
接口
Collection:直接存储
Set List
Map:键名+键值
实现:
ArrayList
Vector
HashSet
Hashtable
算法:实现了很多静态方法,可以对集合进行操作
Collections
Collection体系:
Colllection
List(值可以重复) Set(值不可以重复)
ArrayList Vector LinkedList HashSet TreeSet
List的通用方法
add
remove
set
indexOf
addAll(Collection c)
removeAll(Collection c)
clone();//复制
size();//实际元素个数
capacity();//最大容量
有三种遍历方式
Iterator(迭代器)
Enumeration(序列)
for(循环)
ArrayList Vector LinkedList的区别
ArrayList Vector:以线性表的方式存储,查、改快,增删慢
Vector:是线程安全,方法是同步方法
ArrayList:是线程不安全,方法是非同步方法
LinkedList:单链表,查、改慢,增删快
Set:不可以有重复值
一、两个对象的比较
对于自定义的类,必须覆盖equals方法。该类型的两个对象比较,
只有覆盖了equals方法,才能确定这两个对象是否相同,
否则不管相同还是不相同返回都是false。
二、向set集合对象中加入新对象,插入对象的hasCode值与集合中每一个对象的hashCode值比较,
若有一个相等,返回false.
若都不相同,插入对象与集合中每一个对象比较,若有一个相等,返回false不插入,
若都不相同,将插入对象加入到集合中。
三、在开发中,对于自定义实体必须覆盖toString、hashCode、equals方法
Set只可以有两种遍历方式
iterator
enumeration
HashSet:值不可以重复
TreeSet:值也不可以重复,会自动排序,即然可以排序,集合中对象类型必须相同
Map:是键名+键值,键名不可以重复,键值可以重复,通过键名取键值
HashMap:线程不安全
Hasttable:线程安全
jsp中的作用域对象(session、request、application、page)属于map这个体系
Collection及Collections的区别
Collection是集合的根接口
Collections是算法,提供了静态方法,可以对集合进行操作
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -