JavaEE——No.2 多线程案例

JavaEE传送门

JavaEE

JavaEE——No.2 线程安全问题

JavaEE——No.1 多线程案例



多线程案例

1. 定时器

定时器, 类似于一个 "闹钟". 代码中的定时器, 通常都是设定 “多长时间之后, 执行某个动作”.

例如: 客户端发送请求之后, 就需要等待服务器响应. 如果服务器一直不响应, 客户端也不能一直死等下去. 客户端经常会设置一个超时时间, 这时就可以使用定时器来实现.

标准库中的定时器

  • 标准库中提供了一个 Timer 类. Timer 类的核心方法为 schedule.

  • schedule 包含两个参数. 第一个参数指定即将要执行的任务代码, 第二个参数指定多长时间之后

    执行 (单位为毫秒).

public class Test {
   
   
    public static void main(String[] args) {
   
   
        //标准库的计时器
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
   
   
            @Override
            public void run() {
   
   
                System.out.println("7:00了,该起床了");
            }
        },3000);

        timer.schedule(new TimerTask() {
   
   
            @Override
            public void run() {
   
   
                System.out.println("9:00了,该起床了");
            }
        },5000);

        timer.schedule(new TimerTask() {
   
   
            @Override
            public void run() {
   
   
                System.out.println("8:00了,该起床了");
            }
        },4000);

        System.out.println("闹钟响了!!");
    }
}

这时我们运行代码, 我们发现, 按照时间执行完上述任务之后, 进程并没有退出. Timer 内部需要一组线程来执行注册的任务, 而这里的线程是 前台线程, 会影响进程退出.


定时器的实现

  • schedule 的第一个参数是一个任务, 我们需要能够描述这个任务. (任务包含两方面信息, 需要执行的工作, 与他开始执行的时间)
class MyTask implements Comparable<MyTask>{
   
   
    //要执行的任务
    private Runnable runnable;
    //什么时间来执行任务(一个时间戳)
    private long time;

    public MyTask(Runnable runnable, long dalay) {
   
   
        this.runnable = runnable;
        this.time = System.currentTimeMillis() + dalay;
    }

    public Runnable getRunnable() {
   
   
        return runnable;
    }

    public long getTime() {
   
   
        return time;
    }

    //实现 Comparable 接口, 便于下文 优先级队列的比较
    @Override
    public int compareTo(MyTask o) {
   
   
        return (int)(this.time - o.time);
    }
}
  • MyTimer 管理多个任务, 使用优先级阻塞队列 (保证每次取出等待的时间最短的任务, 与线程安全)
class MyTimer {
   
   
    private BlockingQueue<MyTask> queue = new PriorityBlockingQueue<>();

    public void schedule(Runnable runnable, long after) throws InterruptedException {
   
   
        MyTask myTask = new MyTask(runnable, after);
		queue.put(MyTask);
    }
}
  • 从队列中去元素, 创建一个单独的扫描线程, 让这个线程不停的来检查队首元素, 时间是否到了, 如果到了则执行该任务
class MyTimer {
   
   
    private BlockingQueue<MyTask> queue = new PriorityBlockingQueue<&g
<think>好的,我现在需要帮助用户解决IntelliJ IDEA 2023版本中JavaEE项目向导缺失的问题。首先,我需要回忆一下用户提到的具体问题:“Registry javaee.legacy.project.wizard missing”。用户可能是在尝试创建Java EE项目时,发现旧版的向导选项不见了,这在新版本中可能因为功能迁移或移除导致的。 首先,我应该考虑IntelliJ IDEA近年来对Jakarta EE的支持变化。记得从某个版本开始,JetBrains可能将Java EE重命名为Jakarta EE,所以项目创建向导的名称或位置可能发生了变化。用户可能仍然在寻找旧的Java EE选项,但实际上应该转到Jakarta EE相关部分。 接下来,用户提到的注册表键值“javaee.legacy.project.wizard”可能是一个隐藏的设置,需要通过“Find Action”打开注册表进行调整。我需要确认在IDEA 2023版本中,这个注册表项是否仍然有效,或者是否有替代的方法来启用旧版向导。 另外,用户可能需要手动创建项目,比如使用Maven或Gradle,并手动添加所需的Java EE依赖。这可能是一个可行的替代方案,特别是如果官方已经废弃了旧版的创建向导。 插件问题也是一个可能的原因。检查是否相关插件被禁用或需要更新,比如Jakarta EE插件是否安装并启用。有时候,插件冲突或缺失会导致某些功能不可见。 最后,考虑版本兼容性和官方文档的建议。建议用户检查IDEA的更新日志或官方帮助文档,确认是否有官方的迁移指南或解决方案。如果问题依旧,联系JetBrains支持可能是个好办法。 现在需要将这些思路整理成结构化的步骤,用中文清晰表达,并确保使用正确的LaTeX格式,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学内容。同时,生成相关问题,帮助用户进一步探索可能相关的疑问。</think>### IntelliJ IDEA 2023中JavaEE项目向导缺失的解决方案 #### 原因分析 1. **Jakarta EE名称变更** JavaEE规范已更名为Jakarta EE,IntelliJ IDEA 2023默认使用新名称。旧版向导选项$javaee.legacy.project.wizard$可能被标记为过时或隐藏[^1]。 2. **功能模块调整** JetBrains可能将JavaEE项目创建功能整合到其他模块(如Jakarta EE或企业级开发工具包)中,需通过其他入口访问。 --- #### 具体解决方法 **方法1:通过注册表启用旧版向导** 1. 打开IntelliJ IDEA,使用快捷键$Ctrl+Shift+A$(Windows/Linux)或$Cmd+Shift+A$(macOS)调出“Find Action” 2. 输入`Registry`并回车进入注册表设置 3. 搜索`javaee.legacy.project.wizard`,勾选该选项 4. 重启IDEA后,新建项目时会出现`Java Enterprise`选项。 **方法2:手动创建Jakarta EE项目** 1. 新建项目时选择`Jakarta EE`分类 2. 通过Maven/Gradle添加依赖: ```xml <!-- Maven示例 --> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>10.0.0</version> <scope>provided</scope> </dependency> ``` **方法3:检查插件状态** 1. 前往`File > Settings > Plugins` 2. 确认以下插件已启用: - Jakarta EE - Java EE: JPA, Servers - Application Servers Integration --- #### 补充说明 - 如果遇到依赖缺失问题(类似Tomcat缺少jar包的情况[^2]),建议通过Maven/Gradle统一管理依赖 - IntelliJ 2023默认支持Jakarta EE 10规范,需注意版本兼容性
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值