🧵 添加并使用线程池管理项目中的异步操作

This commit is contained in:
gewuyou 2023-08-26 22:25:20 +08:00
parent 8c589d6133
commit d31772b3d5
8 changed files with 129 additions and 72 deletions

View File

@ -14,6 +14,7 @@ import org.jcnc.jnotepad.app.init.LoadLanguageConfig;
import org.jcnc.jnotepad.app.init.LoadShortcutKeyConfig;
import org.jcnc.jnotepad.constants.AppConstants;
import org.jcnc.jnotepad.controller.manager.Controller;
import org.jcnc.jnotepad.manager.ThreadPoolManager;
import org.jcnc.jnotepad.ui.LineNumberTextArea;
import org.jcnc.jnotepad.view.init.View;
import org.jcnc.jnotepad.view.manager.ViewManager;
@ -22,7 +23,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
@ -34,7 +34,8 @@ public class LunchApp extends Application {
/**
* 线程池
*/
private static final ExecutorService THREAD_POOL = Executors.newCachedThreadPool();
private final ExecutorService threadPool = ThreadPoolManager.getThreadPool();
LocalizationConfig localizationConfig = LocalizationConfig.getLocalizationConfig();
Controller controller = Controller.getInstance();
Scene scene;
@ -71,7 +72,7 @@ public class LunchApp extends Application {
// 使用线程池加载关联文件并创建文本区域
List<String> rawParameters = getParameters().getRaw();
THREAD_POOL.execute(() -> {
threadPool.execute(() -> {
LineNumberTextArea textArea = controller.openAssociatedFileAndCreateTextArea(rawParameters);
if (!Objects.isNull(textArea)) {
Platform.runLater(() -> controller.updateUiWithNewTextArea(textArea));
@ -92,7 +93,7 @@ public class LunchApp extends Application {
@Override
public void stop() {
// 关闭线程池
THREAD_POOL.shutdownNow();
threadPool.shutdownNow();
}
public static void main(String[] args) {

View File

@ -0,0 +1,13 @@
package org.jcnc.jnotepad.controller.event.handler;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
/**
* 本地化处理抽象类
*
* @author gewuyou
*/
public abstract class LocalizationHandler implements EventHandler<ActionEvent> {
}

View File

@ -1,8 +1,9 @@
package org.jcnc.jnotepad.controller.event.handler;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import org.jcnc.jnotepad.controller.manager.Controller;
import org.jcnc.jnotepad.manager.ThreadPoolManager;
import org.jcnc.jnotepad.tool.LogUtil;
import java.io.File;
@ -14,19 +15,16 @@ import static org.jcnc.jnotepad.constants.AppConstants.CONFIG_NAME;
*
* @author gewuyou
*/
public class OpenConfig extends OpenHandler {
public class OpenConfig implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent actionEvent) {
// 获取控制器
Controller controller = Controller.getInstance();
// 显示文件选择对话框并获取选中的文件
// 显示文件选择对话框并获取配置文件
File file = new File(CONFIG_NAME);
LogUtil.getLogger(this.getClass()).info("已调用打开配置文件功能");
LogUtil.getLogger(this.getClass()).info("{}", file);
// 创建打开文件的任务
Task<Void> openFileTask = getVoidTask(controller, file);
// 创建并启动线程执行任务
Thread thread = new Thread(openFileTask);
thread.start();
// 创建打开文件的任务并启动线程执行任务
ThreadPoolManager.getThreadPool().submit(controller.createOpenFileTask(file));
}
}

View File

@ -1,9 +1,10 @@
package org.jcnc.jnotepad.controller.event.handler;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.stage.FileChooser;
import org.jcnc.jnotepad.controller.manager.Controller;
import org.jcnc.jnotepad.manager.ThreadPoolManager;
import java.io.File;
@ -15,7 +16,7 @@ import java.io.File;
*
* @author 许轲
*/
public class OpenFile extends OpenHandler {
public class OpenFile implements EventHandler<ActionEvent> {
/**
* 处理打开文件事件
*
@ -30,11 +31,8 @@ public class OpenFile extends OpenHandler {
// 显示文件选择对话框并获取选中的文件
File file = fileChooser.showOpenDialog(null);
if (file != null) {
// 创建打开文件的任务
Task<Void> openFileTask = getVoidTask(controller, file);
// 创建并启动线程执行任务
Thread thread = new Thread(openFileTask);
thread.start();
// 创建打开文件的任务并启动线程执行任务
ThreadPoolManager.getThreadPool().submit(controller.createOpenFileTask(file));
}
}
}

View File

@ -1,45 +0,0 @@
package org.jcnc.jnotepad.controller.event.handler;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import org.jcnc.jnotepad.controller.manager.Controller;
import java.io.File;
/**
* 打开抽象类
*
* @author gewuyou
*/
public abstract class OpenHandler implements EventHandler<ActionEvent> {
/**
* 获取空返回值任务
*
* @param controller 控制器
* @param file 文件
* @return javafx.concurrent.Task<java.lang.Void>
* @apiNote
*/
protected Task<Void> getVoidTask(Controller controller, File file) {
Task<Void> openFileTask = new Task<>() {
@Override
protected Void call() {
// 调用控制器的getText方法读取文件内容
controller.getText(file);
return null;
}
};
// 设置任务成功完成时的处理逻辑
openFileTask.setOnSucceeded(e -> {
// 处理成功的逻辑
});
// 设置任务失败时的处理逻辑
openFileTask.setOnFailed(e -> {
// 处理失败的逻辑
});
return openFileTask;
}
}

View File

@ -4,6 +4,7 @@ import javafx.application.Platform;
import javafx.concurrent.Task;
import org.jcnc.jnotepad.Interface.ControllerInterface;
import org.jcnc.jnotepad.app.config.LocalizationConfig;
import org.jcnc.jnotepad.manager.ThreadPoolManager;
import org.jcnc.jnotepad.tool.EncodingDetector;
import org.jcnc.jnotepad.tool.LogUtil;
import org.jcnc.jnotepad.ui.LineNumberTextArea;
@ -18,6 +19,8 @@ import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;
import static org.jcnc.jnotepad.manager.ThreadPoolManager.threadContSelfSubtracting;
/**
* 控制器类实现ControllerInterface接口用于管理文本编辑器的各种操作和事件处理
* 包括打开关联文件创建文本区域处理行分隔新建文件打开文件自动保存等功能
@ -151,14 +154,21 @@ public class Controller implements ControllerInterface {
* @param file 文件对象
* @return 打开文件的任务
*/
private Task<Void> createOpenFileTask(File file) {
return new Task<>() {
public Task<Void> createOpenFileTask(File file) {
Task<Void> openFileTask = new Task<>() {
@Override
protected Void call() {
getText(file);
return null;
}
};
// 设置任务成功完成时的处理逻辑
openFileTask.setOnSucceeded(e -> threadContSelfSubtracting());
// 设置任务失败时的处理逻辑
openFileTask.setOnFailed(e -> threadContSelfSubtracting());
return openFileTask;
}
/**
@ -167,9 +177,7 @@ public class Controller implements ControllerInterface {
* @param file 文件对象
*/
private void openFile(File file) {
Task<Void> openFileTask = createOpenFileTask(file);
Thread thread = new Thread(openFileTask);
thread.start();
ThreadPoolManager.getThreadPool().submit(createOpenFileTask(file));
}
}

View File

@ -0,0 +1,84 @@
package org.jcnc.jnotepad.manager;
import org.jcnc.jnotepad.tool.LogUtil;
import org.slf4j.Logger;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 线程池管理类<br>
* 项目中所有异步操作建议使用该类进行获取线程执行异步操作
*
* @author gewuyou
*/
public class ThreadPoolManager {
private ThreadPoolManager() {
}
private static final Logger logger = LogUtil.getLogger(ThreadPoolManager.class);
/**
* 核心线程数
*/
private static final int CORE_POOL_SIZE = 2;
/**
* 最大线程数
*/
private static final int MAXIMUM_POOL_SIZE = 4;
/**
* 空闲线程回收时间间隔
*/
private static final Long KEEP_ALIVE_TIME = 3L;
/**
* 空闲线程回收时间间隔单位
*/
private static final TimeUnit TIME_UNIT = TimeUnit.SECONDS;
/**
* 提交任务的队列<br>
* <br>
* ArrayBlockingQueue有界带缓冲阻塞队列<br>
* SynchronousQueue无缓冲阻塞队列<br>
* LinkedBlockingQueue无界带缓冲阻塞队列
*/
private static final BlockingQueue<Runnable> BLOCKING_QUEUE = new LinkedBlockingQueue<>(4);
/**
* 当前线程数
*/
private static final AtomicInteger THREAD_COUNT = new AtomicInteger(1);
/**
* 线程数自减
*
* @apiNote 当你创建任务时务必在最后执行一次该方法
* @see ThreadPoolManager
* @since 2023/8/26 22:00
*/
public static void threadContSelfSubtracting() {
THREAD_COUNT.decrementAndGet();
}
/**
* 线程工厂
*/
private static final ThreadFactory THREAD_FACTORY = r -> {
Thread thread = new Thread(r);
thread.setName("JNotepad-ThreadPool-Thread-" + THREAD_COUNT.getAndIncrement());
thread.setDaemon(true);
// 设置异常处理器
thread.setUncaughtExceptionHandler((t, e) -> logger.error("线程执行异常!", e));
return thread;
};
/**
* 拒绝处理任务时的策略
*/
private static final RejectedExecutionHandler HANDLER = new ThreadPoolExecutor.AbortPolicy();
/**
* 线程池
*/
private static final ThreadPoolExecutor THREAD_POOL = new ThreadPoolExecutor(
CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_TIME, TIME_UNIT, BLOCKING_QUEUE, THREAD_FACTORY, HANDLER);
public static ExecutorService getThreadPool() {
return THREAD_POOL;
}
}

View File

@ -256,13 +256,13 @@ public class JNotepadMenuBar extends MenuBar {
// 设置窗口为置顶
primaryStage.setAlwaysOnTop(after);
});
englishItem.setOnAction(new OpenHandler() {
englishItem.setOnAction(new LocalizationHandler() {
@Override
public void handle(ActionEvent actionEvent) {
setCurrentLanguage(ENGLISH);
}
});
chineseItem.setOnAction(new OpenHandler() {
chineseItem.setOnAction(new LocalizationHandler() {
@Override
public void handle(ActionEvent actionEvent) {
setCurrentLanguage(CHINESE);