网站设计宁波重庆装修除渣费一般多少

当前位置: 首页 > news >正文

网站设计宁波,重庆装修除渣费一般多少,成都家装设计师名单,镇江建设网站的公司介绍5种多线程方法#xff0c;助您提高编码效率#xff01; 如果您的应用程序与那些能够同时处理多个任务的应用程序相比表现不佳#xff0c;很可能是因为它是单线程的。解决这个问题的方法之一是采用多线程技术。 以下是一些可以考虑的方法#xff1a; 线程#xff08;…介绍5种多线程方法助您提高编码效率 如果您的应用程序与那些能够同时处理多个任务的应用程序相比表现不佳很可能是因为它是单线程的。解决这个问题的方法之一是采用多线程技术。 以下是一些可以考虑的方法 线程Thread并行流Parallel StreamsExecutorServiceForkJoinPoolCompletableFuture 适当地使用这些方法可以彻底改变您的应用程序并推动您的职业发展。下面我们来看看如何将您的应用程序转变为高效的多线程应用。 1 线程Thread
第一种选择是使用线程Thread类。通过这种方式您可以直接控制线程的创建和管理。以下是一个示例 CustomTask 每隔50毫秒从0数到 count - 1。
a、b 和 c 是该类的三个实例。 Threadnbsp;anbsp;nbsp; newnbsp;Thread( newnbsp;CustomTask( a,nbsp; 5)); Threadnbsp;bnbsp;nbsp; newnbsp;Thread( newnbsp;CustomTask( b,nbsp; 10)); Threadnbsp;cnbsp;nbsp; newnbsp;Thread( newnbsp;CustomTask( c,nbsp; 5)); 请注意b 预计计数的次数是其他实例的两倍。您希望在 a 和 c 顺序运行的同时运行 b。 您可以非常容易地实现这种行为。 //nbsp;首先启动 a 和 b。 a.start(); b.start(); //nbsp; a 完成后开始 c。 a.join(); c.start(); 以下是结果: a- 0nbsp;fromnbsp;Thread- 0 b- 0nbsp;fromnbsp;Thread- 1 b- 1nbsp;fromnbsp;Thread- 1 a- 1nbsp;fromnbsp;Thread- 0 b- 2nbsp;fromnbsp;Thread- 1 a- 2nbsp;fromnbsp;Thread- 0 b- 3nbsp;fromnbsp;Thread- 1 a- 3nbsp;fromnbsp;Thread- 0 b- 4nbsp;fromnbsp;Thread- 1 a- 4nbsp;fromnbsp;Thread- 0 b- 5nbsp;fromnbsp;Thread- 1 c- 0nbsp;fromnbsp;Thread- 2 b- 6nbsp;fromnbsp;Thread- 1 c- 1nbsp;fromnbsp;Thread- 2 b- 7nbsp;fromnbsp;Thread- 1 c- 2nbsp;fromnbsp;Thread- 2 b- 8nbsp;fromnbsp;Thread- 1 c- 3nbsp;fromnbsp;Thread- 2 b- 9nbsp;fromnbsp;Thread- 1 c- 4nbsp;fromnbsp;Thread- 2 a 和 b 同时开始运行轮流输出。a 完成后c 开始执行。此外它们全部在不同的线程中运行。通过手动创建 Thread 实例您可以完全控制它们。 然而请注意低级线程处理也需要同步和资源管理这可能更容易出错和复杂。 2 并行流Parallel Streams
当您需要对大型集合中的所有元素应用相同、重复且独立的任务时并行流非常有效。 例如图像调整大小是一个需要按顺序运行的繁重任务当您有多个图像需要调整大小时如果按顺序执行将需要很长时间才能完成。在这种情况下您可以使用并行流并行调整它们的大小如下所示。
这样图像将同时调整大小节省了大量宝贵的时间。 3 ExecutorService
当实现不需要精确的线程控制时可以考虑使用 ExecutorService。ExecutorService 提供了更高层次的线程管理抽象包括线程池、任务调度和资源管理。 ExecutorService 是一个接口它最常见的用法是线程池。假设您有大量的异步任务堆积在一起但是同时运行所有任务——每个任务占用一个线程——似乎太多了。线程池可以通过限制最大线程数来帮助您。 下面的示例中我们使用 Executors.newFixedThreadPool() 实例化 ExecutorService 来使用 3 个线程运行 10 个任务。每个任务只打印一行。请注意我们在之前的部分中重用了之前定义的 CustomTask。 ExecutorServicenbsp;executorServicenbsp;nbsp;Executors.newFixedThreadPool( 3); fornbsp;( intnbsp;inbsp;nbsp; 0;nbsp;inbsp;nbsp; 10;nbsp;i)nbsp;{ nbsp;nbsp;nbsp;nbsp;executorService.submit( newnbsp;CustomTask(String.valueOf(i),nbsp; 1)); } executorService.shutdown(); 这将打印以下结果: 0- 0nbsp;fromnbsp;pool- 1-thread- 1 2- 0nbsp;fromnbsp;pool- 1-thread- 3 1- 0nbsp;fromnbsp;pool- 1-thread- 2 4- 0nbsp;fromnbsp;pool- 1-thread- 3 3- 0nbsp;fromnbsp;pool- 1-thread- 2 5- 0nbsp;fromnbsp;pool- 1-thread- 1 6- 0nbsp;fromnbsp;pool- 1-thread- 1 7- 0nbsp;fromnbsp;pool- 1-thread- 3 8- 0nbsp;fromnbsp;pool- 1-thread- 2 9- 0nbsp;fromnbsp;pool- 1-thread- 3 10 个任务在 3 个线程中运行。通过限制特定任务使用的线程数您可以根据优先级分配线程数对于重要且频繁的任务使用更多线程对于琐碎或偶尔的任务使用较少线程。ExecutorService 具有高效和简洁的特点是大多数多线程场景的首选选项。 如果您需要更多的控制和灵活性请查看 ThreadPoolExecutor它是 Executors.newFixedThreadPool() 返回的 ExecutorService 的实际实现。您可以直接创建其实例或将返回的 ExecutorService 实例转换为 ThreadPoolExecutor 实例以获得更多控制权。 4 ForkJoinPool
ForkJoinPool是另一种线程池正如其名称所示。虽然它在许多其他异步方法的底层使用中但对于可以分解为较小且独立子任务的任务来说它也非常强大这些任务可以通过分而治之的策略来解决。 其中一个任务是图像调整大小。图像调整大小是分而治之问题的一个很好的例子。使用ForkJoinPool您可以将图像分成两个或四个较小的图像并同时调整它们的大小。以下是ImageResizeAction的示例它将图像调整为给定的大小。 请注意ImageResizeAction继承了RecursiveAction。RecursiveAction用于定义递归的调整大小操作。在此示例中图像被分成两半并并行调整大小。 您可以使用以下代码运行ImageResizeAction
借助ForkJoinPool的帮助您现在能够更高效地调整图像的大小具有更好的可伸缩性并最大程度地利用资源。 5 CompletableFuture
通过CompletableFuture您可以完全发挥Future的功能并拥有许多额外的特性。其中最突出的功能是它能够链式地连接异步操作使您能够构建复杂的异步管道。
上述代码展示了CompletableFuture的一个关键方面链式操作。通过CompletableFuture.supplyAsync()首先创建并运行一个返回字符串结果的CompletableFuture。thenApply()接受前一个任务的结果并执行其他操作本例中是添加一个字符串。最后thenAccept()打印生成的数据。结果如下所示 ForkJoinPool.commonPool-worker- 1 ForkJoinPool.commonPool-worker- 1 ForkJoinPool.commonPool-worker- 1 Result:nbsp;Mynbsp;namenbsp;isnbsp;Hyuninbsp;Kim 有3个任务没有在主线程中运行这表明它们与主逻辑并行运行。当您有具有结果并需要链接的任务时CompletableFuture将是一个很好的选择。 6 总结
多线程是一种强大的工具可以帮助开发人员优化性能、提升用户体验、增强并发处理能力并充分利用计算机的资源。