2019.07.23(day19)
线程池:
把若干用户线程添加到线程池中,由线程池来管理线程
为什么要用线程池:
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复的使用,可以并发执行多个任务
2.可以根据系统的承受能力,调整线程池中的工作线程的数目,防止因为消耗过多的内存而使服务器宕机(down)
结论:
java提供一些api方法用于更好的管理线程,让程序员主要用于写线程的逻辑
线程池的使用:
有一个Excutors的工具类,此类提供了若干静态方法
这些静态方法用于生成线程池的对象
手动创建一个线程池
ThreadPoolExecutor ppp=new ThreadPoolExecutor(int corePoolSize, int
maximumPoolSize,long keepAliveTime,TimeUnit
unit,BlockingQueue<Runnable>workQueue,
RejectedExecutionHanlder handler);
corePoolSize:核心池的大小 5
maximumPoolSize:最大池的大小 10
keepAliveTime:空闲的多余线程保持时间 30
unit:时间单位 秒
workQueue:阻塞式队列 BlockingQueue(5)
handler:拒绝服务助手
1.Executors.newSingleThreadExecutor();
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
创建一个单线程的线程池,这个线程池只有一个线程在工作
单线程执行任务,如果这个唯一的线程因为异常结束,就会有一个新的线程来替代它
线程池保证所有的任务是按照任务的提交顺序来执行的
2.Executors.newFixedThreadPool();
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
创建固定大小的线程池,每次提交一个任务就创一个线程,直到达到线程池的最大容量
线程池达到了最大容量就会保持不变
如果这个线程因为执行异常而结束,就会补充一个新的线程
3.Executors.newCachedThreadPool();
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
创建一个可以缓冲的线程池,如果线程池的大小超过了处理的任务所需的线程
就会回收部分线程
当任务数增加的时候,此线程池又可以智能的添加新的线程来处理任务
此线程池不会对线程池的大小做限制,线程池的大小完全依赖操作系统能够创建的最大容量
4.Executors.newScheduledThreadPool();
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
创建一个大小无限制的线程池
此线程支持定时以及周期性的执行任务的需求
网络编程:
分类:
tcp编程(重点):
传输控制协议,能够保证数据传递不丢失
udp编程(省略):
不能保证数据传递不丢失
若干名词:
-socket套接字
-ip地址
ipv4 4段地址
ipv6 6段地址
用于唯一确定网络上的计算机
-端口号:
每台计算机都有65536个端口 0-65535
是能够访问计算机的"门"
特殊的内置端口:
80端口:http协议的默认端口 超文本传输协议
21端口:ftp协议的默认端口 文件传输协议
25端口:smtp协议的默认端口 邮件传输协议
-tcp/ip:传输控制协议/网络协议
socket套接字:
用于描述ip地址和端口号,是一个通讯链的句柄(java的引用)
在internet上的一个主机,一般运行多少个服务的软件,就提供多少个服务
每个服务监听一个端口,不同的端口对应不同的服务
最终应用程序和服务器通过socket套接字建立网络连接
发送请求和接收请求
服务端的套接字:
ServerSocket类:
Socket accept();
用于监听并接受到套接字的连接
void close();
关闭socket
InetAddress getInetAddress();
返回此服务器套接字的本地地址
int getLocalport();
返回此套接字在其上的监听的端口号
客户端套接字:
Socket类:
Socket(String host,int port);
创建一个套接字并将其连接带指定的ip地址,和这个ip地址对应的窗口号
void close();
关闭socket
InetAddress getInetAddress();
返回此服务器套接字的本地地址
int getLocalport();
返回此套接字在其上的监听的端口号