java-线程池接口

1、Executor接口

public interface Executor{

    voidexecute(Runnsable command);

}

2、使用该接口的web server

class TaskExecutionWebServer{

 private static final int NTHREADS=100;

 private static final Executorexec=Executors.newFixedThreadPool(NTHREADS);

 

  public static voidmain(Strings[] args) throws IOException{

       ServerSocket socket=new ServerSocket(80);

       while (true){

            final Socket connecton=socket.accept();

            Runnable task=new Runnable(){

                 public void run(){

                        handleRequest(connection);

                 }

            };

            exec.execute(task);

       }

  }

}

public  class ThreadPerTaskExecutor implementsExecutor{

    public void execute(Runnalbe r){

          new Thread(r).start();

    };

}

 

 

### TCP协议三次握手原理 TCP协议的三次握手是为了建立可靠的连接,其具体过程如下: 1. **客户端向服务器发送SYN包**:客户端向服务器发送一个SYN(Synchronize Sequence Numbers)包,其中包含客户端的初始序列号(ISN),表示客户端希望建立连接。 2. **服务器发送SYN + ACK包**:服务器收到客户端的SYN包后,向客户端发送一个SYN + ACK包。SYN表示服务器也同意建立连接,并包含服务器的初始序列号;ACK是对客户端SYN包的确认,确认号为客户端的初始序列号加1。 3. **客户端发送ACK包**:客户端收到服务器的SYN + ACK包后,向服务器发送一个ACK包,确认号为服务器的初始序列号加1。此时,连接建立成功,双方可以开始传输数据。 ### TCP协议四次挥手原理 TCP协议的四次挥手是为了关闭可靠的连接,其具体过程如下: 1. **客户端发送FIN包**:客户端向服务器发送一个FIN(Finish)包,表示客户端已经没有数据要发送了,请求关闭连接。 2. **服务器发送ACK包**:服务器收到客户端的FIN包后,向客户端发送一个ACK包,确认号为客户端的序列号加1,表示同意关闭客户端到服务器的连接。 3. **服务器发送FIN包**:服务器在处理完剩余的数据后,向客户端发送一个FIN包,表示服务器也没有数据要发送了,请求关闭连接。 4. **客户端发送ACK包**:客户端收到服务器的FIN包后,向服务器发送一个ACK包,确认号为服务器的序列号加1。此时,服务器到客户端的连接也关闭,整个TCP连接关闭。 ### 线程池核心参数 线程池的核心参数通常包括以下几个: 1. **corePoolSize**:核心线程数,即线程池一直保持存活的线程数量。当提交的任务数小于核心线程数时,线程池会创建新的线程来执行任务。 2. **maximumPoolSize**:最大线程数,即线程池允许创建的最大线程数量。当提交的任务数超过核心线程数,且任务队列已满时,线程池会创建新的线程,直到达到最大线程数。 3. **keepAliveTime**:线程空闲时间,即当线程池中的线程数量超过核心线程数时,空闲线程在多长时间内会被销毁。 4. **unit**:keepAliveTime的时间单位,如秒、毫秒等。 5. **workQueue**:任务队列,用于存储等待执行的任务。常见的任务队列有ArrayBlockingQueue、LinkedBlockingQueue等。 6. **threadFactory**:线程工厂,用于创建线程。可以通过自定义线程工厂来设置线程的名称、优先级等。 7. **handler**:拒绝策略,当任务队列已满且线程池中的线程数量达到最大线程数时,新提交的任务会被拒绝。常见的拒绝策略有AbortPolicy、CallerRunsPolicy等。 ### 线程池执行原理 线程池的执行原理如下: 1. 当有新的任务提交时,线程池会首先检查核心线程数是否已满。如果核心线程数未满,则创建新的线程来执行任务。 2. 如果核心线程数已满,则将任务放入任务队列中等待执行。 3. 如果任务队列已满,且线程池中的线程数量未达到最大线程数,则创建新的线程来执行任务。 4. 如果任务队列已满,且线程池中的线程数量已达到最大线程数,则根据拒绝策略来处理新提交的任务。 ### 已淘汰的线程安全集合类 一些已淘汰的线程安全集合类包括: 1. **Vector**:Vector是一个线程安全的动态数组,其方法都是同步的。由于同步操作会带来性能开销,因此在多线程环境下,推荐使用ArrayList和Collections.synchronizedList来替代。 2. **Hashtable**:Hashtable是一个线程安全的哈希表,其方法都是同步的。由于同步操作会带来性能开销,因此在多线程环境下,推荐使用HashMap和Collections.synchronizedMap来替代。 3. **Stack**:Stack是一个线程安全的栈,它继承自Vector。由于同步操作会带来性能开销,因此在多线程环境下,推荐使用Deque接口的实现类,如ArrayDeque。 ### 将不安全集合变为安全集合的方法 可以使用以下方法将不安全集合变为安全集合: 1. **使用Collections工具类**:Collections类提供了一些静态方法,如synchronizedList、synchronizedSet、synchronizedMap等,可以将不安全的集合转换为线程安全的集合。示例代码如下: ```java import java.util.ArrayList; import java.util.Collections; import java.util.List; public class SafeCollectionExample { public static void main(String[] args) { // 创建一个不安全的ArrayList List<String> unsafeList = new ArrayList<>(); // 将不安全的ArrayList转换为线程安全的List List<String> safeList = Collections.synchronizedList(unsafeList); } } ``` 2. **使用并发集合类**:Java提供了一些并发集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,这些集合类在设计上就考虑了线程安全,不需要额外的同步操作。示例代码如下: ```java import java.util.concurrent.ConcurrentHashMap; import java.util.Map; public class ConcurrentCollectionExample { public static void main(String[] args) { // 创建一个线程安全的ConcurrentHashMap Map<String, Integer> concurrentMap = new ConcurrentHashMap<>(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值