欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-02 22:58:16
...

我们可以使用 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();
		}
	}

 

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