版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/uikoo9/article/details/49022269
多线程
多线程是java面试中最爱问的一个问题,当然如果工作多年没准备去面试,正好让你手写代码,那就只能呵呵了~
QThreadUtil
com.uikoo9.util.function.QThreadUtil对java自带的多线程做了封装,其实java自带多线程已经很强大了。
public class QThreadUtil {
/**
* 单线程池执行线程
* @param runnable
*/
public static void runSingle(Runnable runnable){
run(Executors.newSingleThreadExecutor(), runnable);
}
/**
* 固定大小线程池执行线程
* @param runnable
*/
public static void runFixed(Runnable runnable, int n){
run(Executors.newFixedThreadPool(n), runnable);
}
/**
* 可变大小线程池执行线程
* @param runnable
*/
public static void runCached(Runnable runnable){
run(Executors.newCachedThreadPool(), runnable);
}
/**
* 定时线程池执行线程
* @param runnable
* @param n
* @param period
*/
public static void runScheduledBySeconds(Runnable runnable, int n, long period){
runScheduled(runnable, n, 0, period, TimeUnit.SECONDS);
}
/**
* 定时线程池执行线程
* @param runnable
* @param n
* @param idelay
* @param period
* @param unit
*/
public static void runScheduled(Runnable runnable, int n, long idelay, long period, TimeUnit unit){
ScheduledExecutorService executor = Executors.newScheduledThreadPool(n);
executor.scheduleAtFixedRate(runnable, idelay, period, unit);
}
/**
* 线程池执行线程
* @param executor
* @param runnable
*/
private static void run(ExecutorService executor, Runnable runnable){
executor.execute(runnable);
executor.shutdown();
}
}
不要还停留在常见的两种面试多线程实现的方式上,java有更高端的实现方式:线程池服务。
上面列举了几种常见的多线程:
单线程池执行线程
固定大小线程池执行线程
可变大小线程池执行线程、
定时线程池执行线程
定时线程
除了单独开一个线程去执行一些操作外,定时线程是使用的最多的操作,其实已经有点类似简单的定时任务了,
下面是一段示例代码,每小时生成一次七牛云的token,很多服务的token都需要定时做刷新,
/**
* 生成uptoken
*/
public static void genUptoken(){
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(new Runnable() {
public void run() {
uptoken = getUptoken();
}
}, 0, 3500, TimeUnit.SECONDS);
}
定时任务
常见定时任务组件
java中常见的定时任务组件有:cron4j和quartz,jfinalQ选择了小巧的cron4j
使用
1.jar
首先需要引入cron4j-2.2.5.jar,
2.jfinalconfig
在QJfinalConfig中需要添加:
@Override
public void afterJFinalStart() {
// 初始化所有的定时任务
QCron4jUtil.initTasks();
}
3.配置文件
最后在config.properties中配置定时任务:
# cron4j properties cron4j.enable=false cron4j.job1.pattern=21 * * * * cron4j.job1.task=com.uikoo9.z.my.MyTask
比较简单,第一个是是否开启定时任务,第二个是定时任务的规则,第三个是定时任务的实现类,
如果有多个定时任务,请一次写:job1,job2...
4.实现类
实现类也比较简答,给一个示例:
public class MyTask extends Task{
private PlanService planService = Duang.duang(PlanService.class);
@Override
@SuppressWarnings("static-access")
public void execute(TaskExecutionContext arg0) throws RuntimeException {
planService.initPlanDetail();
// System.out.println(1);
}
}
jfinalQ2.0
源码:https://github.com/uikoo9/jfinalQ
更多精彩内容:http://uikoo9.com/
求打赏(长按图片即可识别)~ |
捐助列表:http://uikoo9.com/donate/ |