对比下四个月前写的沙雕代码~你写的代码【优雅】了吗~

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_29694039/article/details/83898770

 

感受下四个月前写的沙雕代码~

/**
 * 多线程并发执行计时器任务
 * 
 * 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();
	}
}

快来加入群聊【Java开源技术分享】(群号551404618),发现精彩内容。
点击链接加入群聊【Java开源技术分享】:

点击链接加入群聊【Java开源技术分享(群号551404618)】:

https://jq.qq.com/?_wv=1027&k=5uL8ME2

猜你喜欢

转载自blog.csdn.net/qq_29694039/article/details/83898770