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

用php建网站wordpress上传主机

用php建网站,wordpress上传主机,网站建设一条龙全包顶呱呱,好的宝安网站建设目录 线程池架构 newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool Executors和ThreaPoolExecutor创建线程池的区别 两种提交任务的方法 线程池架构 线程池是一种线程管理的机制#xff0c;用于维护和复用线程#xff0c;以…目录 线程池架构  newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool Executors和ThreaPoolExecutor创建线程池的区别 两种提交任务的方法 线程池架构  线程池是一种线程管理的机制用于维护和复用线程以减少线程创建和销毁的开销。 在Java中线程池的顶级接口是Executor而真正的线程池接口是ExecutorService。以下是一些重要的类和接口 ExecutorService真正的线程池接口提供了执行、管理和控制任务的方法。 ScheduledExecutorService继承自ExecutorService能够解决那些需要任务重复执行的问题支持定时和周期性任务执行。 ThreadPoolExecutorExecutorService的默认实现提供了丰富的配置选项如核心线程数、最大线程数、工作队列类型等。 ScheduledThreadPoolExecutor继承自ThreadPoolExecutor的ScheduledExecutorService接口实现用于周期性任务调度。 要配置一个线程池是比较复杂的尤其是对于线程池的原理不是很清楚的情况下很有可能配置的线程池不是较优的因此在Executors类里面提供了一些静态工厂生成一些常用的线程池。 在Java中可以通过Executors工厂类提供四种常见类型的线程池 newCachedThreadPool创建一个可缓存线程池适用于执行大量短期异步任务的场景线程数量不受限制可以灵活回收空闲线程。 newFixedThreadPool创建一个固定大小的线程池适用于控制最大并发数的场景超出的任务会在队列中等待。 newScheduledThreadPool创建一个定时线程池用于支持定时及周期性任务执行的场景。 newSingleThreadExecutor创建一个单线程化的线程池用于保证所有任务按照指定顺序执行的场景只会使用唯一的工作线程来执行任务。 通过选择合适的线程池类型并根据实际需求进行配置可以有效管理和优化多线程任务的执行。 newSingleThreadExecutor newSingleThreadExecutor 是 Executors 工厂类提供的一种线程池它创建的是单线程化的线程池。具体来说newSingleThreadExecutor 只会使用单个工作线程来执行任务保证所有任务按照指定顺序如 FIFO、LIFO、优先级依次执行。 这种线程池适用于以下场景 1. 顺序执行需要按照特定顺序执行任务避免并发引起的竞争条件或数据一致性问题。 2. 确保任务不被并发执行有些任务可能不支持并发执行此时可以使用单线程化的线程池来保证任务的顺序执行。 3. 上下文切换开销较大的任务对于一些上下文切换开销较大的任务如果采用并发执行可能带来额外的开销可以选择单线程化的线程池来避免这种情况。 在单线程化的线程池中任务会按照提交的顺序依次执行不会存在并发执行的情况。如果某个任务由于异常结束后续的任务会继续执行不会受到影响。 以下是一个简单的 Java 代码示例演示了如何使用 newSingleThreadExecutor 创建单线程化的线程池并提交任务执行 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class main {public static void main(String[] args) {// 创建一个单线程化的线程池ExecutorService executor Executors.newSingleThreadExecutor();// 提交多个任务给线程池执行for (int i 0; i 5; i) {final int taskId i;executor.submit(() - {System.out.println(任务 taskId 正在线程上运行 Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 保持中断状态}});}// 关闭线程池executor.shutdown();} }在上面的示例中我们首先通过 Executors.newSingleThreadExecutor() 方法创建了一个单线程化的线程池。然后使用 executor.submit() 方法向线程池提交了5个任务每个任务都会打印当前线程名并模拟执行一段时间。最后通过 executor.shutdown() 关闭了线程池。  需要注意的是虽然该线程池只使用单个工作线程来执行任务但仍然可以通过 ExecutorService 提供的方法提交多个任务这些任务会按照提交的顺序被放入队列并由单个工作线程逐个执行。 总之SingleThreadExecutor 用于串行执行任务的场景每个任务必须按顺序执行不需要并发执行。 newFixedThreadPool newFixedThreadPool 是 Executors 工厂类提供的一种固定大小的线程池它创建的线程池具有固定数量的工作线程。具体来说newFixedThreadPool 创建的线程池会维护一个固定数量的工作线程当有任务提交时会使用其中一个工作线程来执行任务。 这种线程池适用于以下场景 控制最大并发数需要限制并发执行的任务数量以防止系统资源被过度占用。 资源限制对于一些资源受限的场景如数据库连接池、网络连接池等可以使用固定大小的线程池来控制资源的分配和利用。 预测性能需求在已知任务量和性能需求的情况下可以根据需求预先配置固定数量的工作线程以保证系统在高负载时仍能稳定运行。 在固定大小的线程池中线程的数量是固定的不会根据任务的增加或减少而自动调整。如果所有工作线程都正在执行任务并且有新任务提交时新任务会被放入队列中等待直到有工作线程空闲出来才会被执行。 以下是一个简单的 Java 代码示例演示了如何使用 newFixedThreadPool 创建固定大小的线程池并提交任务执行 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class main {public static void main(String[] args) {// 创建一个固定大小为3的线程池ExecutorService executor Executors.newFixedThreadPool(3);// 提交多个任务给线程池执行for (int i 0; i 5; i) {final int taskId i;executor.submit(() - {System.out.println(任务 taskId 正在线程上运行: Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 保持中断状态}});}// 关闭线程池executor.shutdown();} }在上面的示例中我们通过 Executors.newFixedThreadPool(3) 方法创建了一个固定大小为3的线程池。然后使用 executor.submit() 方法向线程池提交了5个任务每个任务都会打印当前线程名并模拟执行一段时间。最后通过 executor.shutdown() 关闭了线程池。 当你运行这段代码时你会看到虽然提交了5个任务但是只有3个任务会同时在不同的工作线程中执行因为线程池的大小被限制为3。剩余的任务会在有线程空闲时依次执行。 需要注意的是在使用固定大小的线程池时应该根据系统资源和运行环境合理地配置线程数量避免资源浪费或不足的情况发生。 总之FixedThreadPool 用于负载比较重的服务器为了资源的合理利用需要限制当前线程数量。 newCachedThreadPool newCachedThreadPool 是 Executors 工厂类提供的一种可缓存线程池它创建的线程池会根据需要自动调整线程数量。具体来说当有新任务提交时如果当前有空闲线程则会立即使用空闲线程执行任务如果没有空闲线程则会创建新的线程来处理任务。而对于长时间闲置未被使用的线程它们会在一定的空闲时间后被回收从而使得线程池的大小能够动态调整。 这种线程池适用于以下场景 处理大量短时耗任务适用于有大量短时耗的任务需要处理的情况例如网络请求响应、小数据处理等。 并发需求不确定当并发需求不确定且系统资源充足时可以使用可缓存线程池来动态调整线程数量以适应不同负载情况。 短期高并发对于突发性的高并发情况可缓存线程池能够快速创建新线程来应对从而保证任务的及时处理。 以下是一个简单的 Java 代码示例演示了如何使用 newCachedThreadPool 创建可缓存线程池并提交任务执行 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class main {public static void main(String[] args) {// 创建一个可缓存线程池ExecutorService executor Executors.newCachedThreadPool();// 提交多个任务给线程池执行for (int i 0; i 5; i) {final int taskId i;executor.submit(() - {System.out.println(任务 taskId 正在线程上运行 Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 保持中断状态}});}// 关闭线程池executor.shutdown();} }在上面的示例中我们通过 Executors.newCachedThreadPool() 方法创建了一个可缓存线程池。然后使用 executor.submit() 方法向线程池提交了5个任务每个任务都会打印当前线程名并模拟执行一段时间。最后通过 executor.shutdown() 关闭了线程池。 当你运行这段代码时你会看到所有5个任务都会立即在不同的工作线程中执行因为可缓存线程池会根据需要动态调整线程数量。这种机制能够很好地适应不同负载情况下的任务处理需求。 需要注意的是由于可缓存线程池的特性是动态调整线程数量因此在任务提交过多导致线程数激增时需要谨慎控制以避免资源耗尽的情况发生。 总之CachedThreadPool 用于并发执行大量短期的小任务或者是负载较轻的服务器。 newScheduledThreadPool newScheduledThreadPool 是 Executors 工厂类提供的一种创建定时任务的线程池。它创建的线程池可以执行延迟任务和周期性任务它会在给定的延迟时间后执行任务或者定期执行任务。这种线程池适用于需要执行定时任务或者周期性任务的场景。 具体来说newScheduledThreadPool 创建的线程池有以下特点 支持延迟任务执行可以使用 schedule() 方法提交一个任务并指定延迟时间线程池会在延迟时间过去后执行相应的任务。支持周期性任务执行可以使用 scheduleAtFixedRate() 或者 scheduleWithFixedDelay() 方法提交一个任务并指定初始延迟时间和执行间隔线程池会按照指定的间隔周期性执行任务。灵活控制可以通过 ScheduledExecutorService 提供的方法对定时任务进行取消、查询等操作非常灵活方便。 在实际应用中newScheduledThreadPool 可以用于定时数据同步、定时任务触发、定时器等场景能够很好地满足对任务执行时间有特定要求的需求。 下面是一个简单的 Java 代码示例演示了如何使用 newScheduledThreadPool 创建定时任务的线程池并提交延迟任务和周期性任务 import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit;public class main {public static void main(String[] args) {// 创建一个定时任务线程池ScheduledExecutorService executor Executors.newScheduledThreadPool(1);// 提交延迟任务executor.schedule(() - System.out.println(延迟的任务), 2, TimeUnit.SECONDS);// 提交周期性任务executor.scheduleAtFixedRate(() - System.out.println(周期性任务), 0, 1, TimeUnit.SECONDS);// 等待一段时间后关闭线程池try {Thread.sleep(5000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}executor.shutdown();} }在上面的示例中我们通过 Executors.newScheduledThreadPool(1) 方法创建了一个定时任务线程池。然后使用 schedule() 方法提交了一个延迟任务在2秒后执行同时使用 scheduleAtFixedRate() 方法提交了一个周期性任务每隔1秒执行一次。最后我们等待一段时间后关闭了线程池。 当你运行这段代码时你会看到延迟任务和周期性任务会按照预定的时间被执行。这展示了 newScheduledThreadPool 的定时任务执行能力。 总之ScheduledThreadPoolExecutor 用于需要多个后台线程执行周期任务同时需要限制线程数量的场景。 Executors和ThreaPoolExecutor创建线程池的区别 在 Java 中确实存在着 Executors 工厂类的几种创建线程池的方法存在一些缺陷让我们来具体分析一下。 1、newFixedThreadPool 和 newSingleThreadExecutor 这两种方法都使用了无界的 LinkedBlockingQueue 作为工作队列在任务提交速度持续大于任务处理速度的情况下可能会导致队列中累积大量的任务从而消耗大量内存。如果任务量非常大或者任务执行时间非常长那么这种设计就会面临 OutOfMemoryError 简称OOM的风险。 2、newCachedThreadPool 和 newScheduledThreadPool 这两种方法在某些情况下可能会创建大量的线程因为它们的最大线程数是 Integer.MAX_VALUE。如果系统负载突然增加那么就可能创建非常多的线程从而消耗大量系统资源甚至导致 OutOfMemoryError简称OOM。 而相较之下使用 ThreadPoolExecutor 构造函数创建线程池可以更好地控制线程池的行为避免上述问题。通过 ThreadPoolExecutor 的构造函数可以显式地指定核心线程数、最大线程数、工作队列类型、拒绝策略等参数从而更精细地控制线程池的行为。 因此在开发中建议根据具体需求和系统负载情况选择合适的线程池创建方法并结合 ThreadPoolExecutor 来进行更为细致的参数配置以避免潜在的问题。 两种提交任务的方法 ExecutorService 提供了两种提交任务的方法 1、execute(Runnable command) 这个方法用于提交不需要返回值的任务。它接受一个 Runnable 对象作为参数表示要执行的任务但并不关心任务的返回结果。 ExecutorService executor Executors.newFixedThreadPool(10); executor.execute(new RunnableTask());2、submit(CallableT task) 这个方法用于提交需要返回值的任务。它接受一个 Callable 对象作为参数表示要执行的任务并返回一个 Future 对象通过它可以获取任务执行的结果。 ExecutorService executor Executors.newFixedThreadPool(10); FutureString future executor.submit(new CallableTask()); String result future.get(); // 获取任务执行结果通过这两种方法可以灵活地提交不同类型的任务并根据需要获取它们的执行结果。execute 方法适用于 fire-and-forget 的场景而 submit 方法则更适合需要获取任务执行结果的情况。 以下是使用 ExecutorService 提供的 execute 和 submit 方法的示例代码 import java.util.concurrent.*;public class main {public static void main(String[] args) throws InterruptedException, ExecutionException {// 创建一个固定大小为 3 的线程池ExecutorService executor Executors.newFixedThreadPool(3);// 提交第一个任务FutureInteger future1 executor.submit(() - {System.out.println(任务1正在运行);return 42;});// 提交第二个任务并依赖于第一个任务的结果FutureInteger future2 executor.submit(() - {int result future1.get(); // 等待第一个任务的执行结果System.out.println(任务2正在根据任务1的结果运行 result);return result * 2;});// 提交第三个任务并依赖于第二个任务的结果executor.execute(() - {try {int result future2.get(); // 等待第二个任务的执行结果System.out.println(任务3正在根据任务2的结果运行 result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}});// 关闭线程池executor.shutdown();} }在这个示例中我们使用submit方法提交了第一个和第二个任务并使用execute方法提交了第三个任务。第二个任务依赖于第一个任务的结果而第三个任务则依赖于第二个任务的结果。通过这种方式我们展示了如何在复杂情况下使用ExecutorService的execute和submit方法来提交具有相互依赖关系的任务。
http://www.pierceye.com/news/869897/

相关文章:

  • 学校网站信息化建设工作心得网络营销现状分析
  • 藁城专业网站建设班级同学录网站建设
  • 北京手机网站开发公司wordpress用户列表
  • 上海 企业网站制成都营销型网站建设熊掌号
  • 无锡网站优化哪家好北京注册公司地址可以是住宅吗
  • 中国十大热门网站深圳哪做网站
  • 木渎网站建设聚美优品网站建设情况
  • 企业形象网站用什么语言开发网站优化要做哪些工作
  • 中国建设银行官网站电话号码wordpress关键词排名
  • 南通网站建设机构博物馆网站建设的根本意义
  • 食品企业网站建设中信建设有限责任公司陈晓佳
  • 中国网站服务器哪个好店名注册查询
  • 网站设计制作案例软件定制开发的发展前景
  • 中国联通网站备案小程序是什么原理
  • 企业网站建设御彩云dz做电影网站
  • 做网站需要的东西网站改版是什么
  • 网站需要哪些北京正规网站建设比较
  • 建设公共网站的手续成都公司网站制作
  • 怎么用安卓机顶盒做网站服务器怎样建立微信公众号平台
  • 专业的集团网站开发开发平面设计软件哪个好用
  • 天津模板建站代理咖啡厅网站开发目标
  • 电子商务网站运营 需要确立如何自己做网页
  • 邯郸市魏县建设局网站个人免费网站申请
  • 建设网站需要备案wordpress文章管理插件
  • 企业网站源码程序多少钱?桓台网站建设
  • vps服务器购买网站自己做的网站可以买东西吗
  • 必应网站建设深圳设计大厦
  • 如何禁止ip访问网站常州网站建设公司推荐
  • 大型论坛网站建设设计公司
  • 河北网诚网站建设企业采购平台有哪几个知名