对比下四个月前写的沙雕代码~你写的代码【优雅】了吗~
感受下四个月前写的沙雕代码~
/**
* 多线程并发执行计时器任务
*
* timer 同样继承了runable接口
* @author aishangxuejie
* @date 2018年7月12日 下午4:10:14
* @param name
* @param pathName
*/
public class DoMailMain {
/**
* 关于此处子线程的wait()方法,为什么子线程t1.join()中调用了wait()方法,却不是子线程t1等待,并且处于阻塞状态呢?
*
* 查了下源码关于wait()的注释:
* Causes the current thread to wait until either another thread invokes the
* 使当前线程等待,直到另一个线程调用
* This method should only be called by a thread that is the owner of this object's monitor
* 此方法只应由该对象监视器的所有者线程调用
*
* 所以,wait()的作用是让“当前线程”等待,而这里的“当前线程”是指当前在CPU上运行的线程。
* 虽然t1.join()中调用了wait()方法,但是它是通过“主线程”去调用的;所以,阻塞的是主线程,而不是“子线程”!
*/
public static void main(String[] args) throws InterruptedException {
System.out.println("--------------启动邮件提醒服务---------------");
//最简单的线程顺序执行 ||使用newCachedThreadPool(ThreadFactory)定制线程工厂
CheckErrorService2.refreshDate();
// 创建两个定时任务
Timer1 timer1 = new Timer1();
Timer2 timer2 = new Timer2();
// 两个线程
Thread t1 = new Thread(timer1);
Thread t2 = new Thread(timer2);
t1.start();
// 根据源码,join(0)会循环测试t1线程是否处于活动状态,如果isAlive=ture,t1继续wait();false,解除阻塞状态,执行main线程;
t1.join();//join使两个线程由并行执行变成串行执行
t2.start();
}
}
class Timer1 extends TimerTask {
@Override
public void run() {
Timer timer1 = new Timer();
// 第一次参数:执行方法,第二个参数:延迟执行,第三个参数:周期
timer1.schedule(new Timer1(), CheckErrorService2.PERIOD1);
try {
CheckErrorService2.checkError();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Timer2 extends TimerTask {
CheckErrorService2 ces2 = new CheckErrorService2();
@Override
public void run() {
//lwsj_tranlog 错误同步日志--------------------------------------------------------
Timer timer2 = new Timer();
// 第一次参数:执行方法,第二个参数:延迟执行,第三个参数:周期
timer2.schedule(new Timer2(), CheckErrorService2.PERIOD2);//30分钟
try {
CheckErrorService2.checkLwjsError();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
感受下Java8 优雅编程代码~
/**
* 多线程并发执行计时器任务
*
* timer 同样继承了runable接口
* @author aisshangxuejie
* @date 2018年11月9日15:24:37
* @param name
* @param pathName
*/
public class DoMailMain {
/**
* 关于此处子线程的wait()方法,为什么子线程t1.join()中调用了wait()方法,却不是子线程t1等待,并且处于阻塞状态呢?
*
* 查了下源码关于wait()的注释:
* Causes the current thread to wait until either another thread invokes the
* 使当前线程等待,直到另一个线程调用
* This method should only be called by a thread that is the owner of this object's monitor
* 此方法只应由该对象监视器的所有者线程调用
*
* 所以,wait()的作用是让“当前线程”等待,而这里的“当前线程”是指当前在CPU上运行的线程。
* 虽然t1.join()中调用了wait()方法,但是它是通过“主线程”去调用的;所以,阻塞的是主线程,而不是“子线程”!
*/
public static void main(String[] args) throws InterruptedException {
System.out.println("--------------启动邮件提醒服务---------------");
//最简单的线程顺序执行 ||使用newCachedThreadPool(ThreadFactory)定制线程工厂
CheckErrorService2.refreshDate();
//java8 lambda 表达式方式
Thread t3 = new Thread(() -> {
Timer timer3 = new Timer();
timer3.schedule(new TimerTask() {
@Override
public void run() {
try {
CheckErrorService2.checkError();
} catch (InterruptedException | ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, CheckErrorService2.PERIOD1);
});
Thread t4 = new Thread(() -> {
Timer timer4 = new Timer();
timer4.schedule(new TimerTask() {
@Override
public void run() {
try {
CheckErrorService2.checkError();
} catch (InterruptedException | ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, CheckErrorService2.PERIOD1);
});
t3.start();
t3.join();// 根据源码,join(0)会循环测试t1线程是否处于活动状态,如果isAlive=ture,t1继续wait();false,解除阻塞状态,执行main线程;
t4.start();
}
}