利用多线程通过对业务优化实现性能优化—— 性能优化利用 Thread 的 join

我们可以使用 join方法做到将程序并行。

举个例子:我们在开发过程中往往会遇到这样的场景,就是一个非常复杂的业务逻辑里边,比方说订票,如果说飞机票和火车票作为一个组装行程。比方说我要去 莫斯科,我人在A地,然后我可以选择去B地坐飞机,但是A地到B地这一段,我想做高铁。如果这作为一个订单的话,就意味着,下单过程需要到12306去扣火车票,然后到航空公司去扣飞机票。

  对于上边的下单的过程,可以选择串行,比方说先去 12306扣火车票,再去航空公司扣机票,最终将结果返回。其实我们知道,整个下单过程是非常复杂的,都要检验什么的,如果串行操作的话,是非常耗时的。

  这个时候我们可以使用多线程来处理我们的下单过程,线程A去处理扣火车票,线程B去处理扣飞机票。最后将最终的结果返回。

   通过上边的问题的描述,其实就能引出一个问题,那就是我们需要等两个线程执行完成以后才能返回结果。我们如何知道线程A有没有执行完成呢,我们如何知道B执行完了呢,我们什么时候才放回结果呢?

  这个时候就可以使用 Thread 的 join()方法,它可以做到,让主线程创建完A和B线程以后,等待A 和 B 线程执行结束以后再开始执行。怎么做到呢?

 就是 主线程分别给A和B都进行Join()

 下边来写一个例子模仿,这样的场景问题:

/**
 * @author angus
 * @create 2020-03-14 15:59
 */
public class ThreadJoin {

	public static void main(String[] args) {
		//创建两个线程
		List<Thread> threads = IntStream.range(1,3).mapToObj(ThreadJoin::creatThread)
				.collect(Collectors.toList());

		//分别开始两个线程
		threads.forEach(Thread::start);

		//两个线程进行 join
		for (Thread thread:threads){
			try {
				thread.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		//主线程执行的逻辑
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName() + "#" + i);
			shortSleep();
		}
	}
	private static Thread creatThread(int seq){
		return new Thread(()->{
			for (int i = 0; i < 10; i++) {
				System.out.println(Thread.currentThread().getName() + "#" + i);
				shortSleep();
			}
		});
	}

	private static void shortSleep(){
		try {
			//线程等待一秒
			TimeUnit.SECONDS.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

 结束语:这只是一个例子,就这个业务而言,能不能这样做需要考究,因为多线程能够提升性能,但是会带来很多的问题。这个例子是想说明,通过多线程能够提升性能,对于两个完全没有依赖关系的业务就可以这样做。而我说的要考究是,因为扣票问题,任何一方扣票失败,整个过程就失败了。 这个过程涉及到了原退的问题,涉及到了手续费的问题。一个关键点在于,如果其中一方失败了,一方成功了,需要进行原退。如果可以进行原退,那就可以使用多线程。

发布了371 篇原创文章 · 获赞 437 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/star1210644725/article/details/104862793
今日推荐