JavaEE线程安全的线程池实现

线程虽然比进程更轻量,但是如果创建销毁的频率进一步增加,开销还是很大
解决方案:线程池or协程

线程池:把线程提前创建好放到池子里,后续用到线程直接从池子里取不必这边申请了。线程用完了也不是还给系统而是放回池子,以备下次再用。

为什么线程放在池子里就比从系统申请释放来得更快呢?
在这里插入图片描述

用户写的代码就是在最上面的应用程序来运行,这里的代码都称为“用户态”运行的代码,有些代码需要调用API进一步的逻辑就会在内核中执行。在内核中执行的代码称为“内核态”运行的代码。创建线程是在内核中创建PCB加到链表里,本身就需要内核的支持,调用Thread.start也是要在内核态上运行的。而创建好的线程放进池子里是用户态实现的,这个放进池里/从池子里取过程不涉及内核态,就是用户代码就能完成。一般认为纯用户态的操作效率要比内核态处理的操作效率更高。

java标准库中的线程池:

ThreadPoolExecutor需要java.util.concurrent包,Java中很多线程相关的组件都在concurrent包里

线程池构造方法:

ThreadPoolExecutor(int corePoolSize, 
int maximumPoolSize, 
long keepAliveTime, 
TimeUnit unit, 
BlockingQueue<Runnable> workQueue, 
ThreadFactory threadFactory, 
RejectedExecutionHandler handler)

线程池参数解析:

int corePoolSize 核心线程数(正式员工的数量)
int maximumPoolSize 最大线程数(正式员工+临时员工)
long keepAliveTime 允许临时工摸鱼的时间
TimeUnit unit 时间的单位(s,ms,us…)
BlockingQueue<Runnable workQueue 任务队列(线程池会提供一个submit方法让程序员把任务注册到线程池中,加到这个任务队列中)
ThreadFactory threadFactory 线程工厂(线程是怎么创建出来的)
RejectedExecutionHandler handler 拒绝策略
(当任务满了怎么做?1.直接忽略最新的任务 2.阻塞等待 3.直接丢弃最老的任务 …)

一个程序要并发的/多线程的来完成一些任务,如果使用线程池的话这里线程数量多少合适?

通过测试性能找到合适的值,例如,写一个服务器程序通过线程池,多线程处理用户请求就可以对这个服务器性能经行测试。比如每秒发送500/1000/2000的请求…
根据不同线程池的线程数来观察程序处理任务的速度和程序持有的CPU的占用率。当线程数量多了整体速度是会变快但是CPU占用率也会高,当线程数少了整体速度会变慢但是Cpu占用率也会下降。
需要找到一个让程序速度能接受并且CPU占用也合理的平衡点,不同类型的程序单个任务在CPU上计算时间和阻塞时间的分布是不相同的,因此不是一个确定的数字。

简化版的线程池

Executors本质是针对ThreadPoolExecutor进行了封装提供了一些默认参数。

public class 线程池 {
   
    public static void main(String[] args) {
   
        // 创建一个固定线程数目的线程池. 参数指定了线程个数
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于JavaEE登录界面的实现,你可以按照以下步骤进行: 1. 创建一个登录页面的JSP文件,例如login.jsp,用于用户输入用户名和密码。 2. 在login.jsp中使用HTML表单来收集用户的输入。 3. 创建一个Servlet类,用于处理用户提交的登录表单数据。 4. 在Servlet中,获取用户输入的用户名和密码参数,并进行验证。 5. 可以使用数据库或其他认证方式对用户进行验证。例如,查询数据库中的用户表,验证用户名和密码是否匹配。 6. 如果验证成功,则可以进行一些操作,例如将用户信息存储到Session中,然后重定向到主页或其他需要登录访问的页面。 7. 如果验证失败,则返回登录页面,并显示错误消息。 下面是一个简单的示例代码,仅用于演示目的: login.jsp: ```html <!DOCTYPE html> <html> <head> <title>Login Page</title> </head> <body> <h1>Login Page</h1> <form action="LoginServlet" method="post"> <label for="username">Username:</label> <input type="text" id="username" name="username" required><br><br> <label for="password">Password:</label> <input type="password" id="password" name="password" required><br><br> <input type="submit" value="Login"> </form> </body> </html> ``` LoginServlet.java: ```java import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); // 在此进行用户验证的逻辑,例如查询数据库是否存在该用户 // 假设验证成功 if ("admin".equals(username) && "password".equals(password)) { HttpSession session = request.getSession(); session.setAttribute("username", username); response.sendRedirect("home.jsp"); // 重定向到主页或其他页面 } else { request.setAttribute("error", "Invalid username or password"); request.getRequestDispatcher("login.jsp").forward(request, response); // 返回登录页面并显示错误消息 } } } ``` 请注意,这只是一个简单的示例代码用于演示JavaEE登录界面的实现。实际中,你可能需要根据具体需求进行更多的验证和处理。另外,还可以使用框架如Spring Security来简化身份验证和授权的实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值