- 浏览: 953484 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
Executor接口的定义:http://donald-draper.iteye.com/blog/2365625
ExecutorService接口定义:http://donald-draper.iteye.com/blog/2365738
Future接口定义:http://donald-draper.iteye.com/blog/2365798
FutureTask解析:http://donald-draper.iteye.com/blog/2365980
CompletionService接口定义:http://donald-draper.iteye.com/blog/2366239
ExecutorCompletionService解析:http://donald-draper.iteye.com/blog/2366254
看这篇文章之前,对于没有接触过java并发包的朋友,建议将上面几个链接文章看完。
超时执行Callable任务集,与非超时执行任务集不同的点是,
第一点:在每次执行任务,判断是否超时,超时则返回结果集;
第二点:在等待线程任务结束时,为超时等待;
再来看InvokeAny方法:
invokeAny的任务集,主要通过ExecutorCompletionService去执行,
当有任务执行结束时,获取执行结果,并取消其他任务。
总结:
无论是提交Runnable任务,还是Callable都是创建FutureTask执行任务,然后执行,返回结果。执行Callable任务集,遍历任务集合,创建相应的RunnableFuture任务,并添加到结果集;遍历结果集,等待所有任务执行完。超时执行Callable任务集,与非超时执行任务集不同的点是,第一点:在每次执行任务,判断是否超时,超时则返回结果集;第二点:在等待线程任务结束时,为超时等待。invokeAny的任务集,主要通ExecutorCompletionService去执行,当有任务执行结束时,获取执行结果,并取消其他任务。
ExecutorService接口定义:http://donald-draper.iteye.com/blog/2365738
Future接口定义:http://donald-draper.iteye.com/blog/2365798
FutureTask解析:http://donald-draper.iteye.com/blog/2365980
CompletionService接口定义:http://donald-draper.iteye.com/blog/2366239
ExecutorCompletionService解析:http://donald-draper.iteye.com/blog/2366254
看这篇文章之前,对于没有接触过java并发包的朋友,建议将上面几个链接文章看完。
package java.util.concurrent; import java.util.*; /** * Provides default implementations of {@link ExecutorService} * execution methods. This class implements the <tt>submit</tt>, * <tt>invokeAny</tt> and <tt>invokeAll</tt> methods using a * {@link RunnableFuture} returned by <tt>newTaskFor</tt>, which defaults * to the {@link FutureTask} class provided in this package. For example, * the implementation of <tt>submit(Runnable)</tt> creates an * associated <tt>RunnableFuture</tt> that is executed and * returned. Subclasses may override the <tt>newTaskFor</tt> methods * to return <tt>RunnableFuture</tt> implementations other than * <tt>FutureTask</tt>. * AbstractExecutorService提供了ExecutorService执行方法的默认实现。 submit,invokeAny,invokeAll方法主要通过newTaskFor方法返回一个RunnableFuture ,默认为FutureTask。比如FutureTask方法创建一个关联的RunnableFuture,并返回。 子类可以重写newTaskFor方法,返回一个除FutureTask之外的RunnableFuture接口实现。 * <p> <b>Extension example</b>. Here is a sketch of a class * that customizes {@link ThreadPoolExecutor} to use * a <tt>CustomTask</tt> class instead of the default <tt>FutureTask</tt>: 下面是一个ThreadPoolExecutor实现范例,用CustomTask代替默认的FutureTask。 * <pre> {@code * public class CustomThreadPoolExecutor extends ThreadPoolExecutor { * * static class CustomTask<V> implements RunnableFuture<V> {...} * * protected <V> RunnableFuture<V> newTaskFor(Callable<V> c) { * return new CustomTask<V>(c); * } * protected <V> RunnableFuture<V> newTaskFor(Runnable r, V v) { * return new CustomTask<V>(r, v); * } * // ... add constructors, etc. * }}</pre> * * @since 1.5 * @author Doug Lea */ public abstract class AbstractExecutorService implements ExecutorService { /** * Returns a <tt>RunnableFuture</tt> for the given runnable and default * value. * 根据给定的Runnable和value,返回一个RunnableFuture,实际为FutureTask * @param runnable the runnable task being wrapped * @param value the default value for the returned future * @return a <tt>RunnableFuture</tt> which when run will run the * underlying runnable and which, as a <tt>Future</tt>, will yield * the given value as its result and provide for cancellation of * the underlying task. * @since 1.6 */ protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) { return new FutureTask<T>(runnable, value); } /** * Returns a <tt>RunnableFuture</tt> for the given callable task. * 根据Callable,返回一个RunnableFuture,实际为FutureTask * @param callable the callable task being wrapped * @return a <tt>RunnableFuture</tt> which when run will call the * underlying callable and which, as a <tt>Future</tt>, will yield * the callable's result as its result and provide for * cancellation of the underlying task. * @since 1.6 */ protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) { return new FutureTask<T>(callable); } /** 提交,执行一个返回值为void的Runnable任务 * @throws RejectedExecutionException {@inheritDoc} * @throws NullPointerException {@inheritDoc} */ public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); //创建任务 RunnableFuture<Void> ftask = newTaskFor(task, null); //实际在Executor为抽象方法,待子类扩展 execute(ftask); return ftask; } /** 提交,执行一个返回值为T的Runnable任务,与submit(Runnable task)方法,基本没区别 * @throws RejectedExecutionException {@inheritDoc} * @throws NullPointerException {@inheritDoc} */ public <T> Future<T> submit(Runnable task, T result) { if (task == null) throw new NullPointerException(); //创建任务 RunnableFuture<T> ftask = newTaskFor(task, result); execute(ftask); return ftask; } /** 提交,执行一个Callable任务 * @throws RejectedExecutionException {@inheritDoc} * @throws NullPointerException {@inheritDoc} */ public <T> Future<T> submit(Callable<T> task) { if (task == null) throw new NullPointerException(); //创建任务 RunnableFuture<T> ftask = newTaskFor(task); execute(ftask); return ftask; } //执行Callable任务集 public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException { if (tasks == null) throw new NullPointerException(); List<Future<T>> futures = new ArrayList<Future<T>>(tasks.size()); boolean done = false; try { //遍历任务集合,创建相应的RunnableFuture任务,并添加到结果集 for (Callable<T> t : tasks) { RunnableFuture<T> f = newTaskFor(t); futures.add(f); execute(f); } //遍历结果集,等待所有任务执行完 for (Future<T> f : futures) { if (!f.isDone()) { try { f.get(); } catch (CancellationException ignore) { } catch (ExecutionException ignore) { } } } done = true; //执行完,返回结果集 return futures; } finally { if (!done) //如果任务未执行完,遍历结果集,取消任务 for (Future<T> f : futures) f.cancel(true); } } //超时执行Callable任务集 public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException { if (tasks == null || unit == null) throw new NullPointerException(); long nanos = unit.toNanos(timeout); List<Future<T>> futures = new ArrayList<Future<T>>(tasks.size()); boolean done = false; try { for (Callable<T> t : tasks) futures.add(newTaskFor(t)); long lastTime = System.nanoTime(); //与非超时执行任务集不同的点是,在每次执行任务,判断是否超时,超时则返回结果集 // Interleave time checks and calls to execute in case // executor doesn't have any/much parallelism. Iterator<Future<T>> it = futures.iterator(); while (it.hasNext()) { execute((Runnable)(it.next())); long now = System.nanoTime(); nanos -= now - lastTime;//nanos = nanos - (now - lastTime),剩下超时时间 lastTime = now; if (nanos <= 0) return futures; } for (Future<T> f : futures) { if (!f.isDone()) { if (nanos <= 0) return futures; try { //另一个不同点,为超时等待任务线程执行完 f.get(nanos, TimeUnit.NANOSECONDS); } catch (CancellationException ignore) { } catch (ExecutionException ignore) { } catch (TimeoutException toe) { return futures; } long now = System.nanoTime(); nanos -= now - lastTime;//nanos = nanos - (now - lastTime),剩下超时时间 lastTime = now; } } done = true; return futures; } finally { if (!done) for (Future<T> f : futures) f.cancel(true); } } }
超时执行Callable任务集,与非超时执行任务集不同的点是,
第一点:在每次执行任务,判断是否超时,超时则返回结果集;
第二点:在等待线程任务结束时,为超时等待;
再来看InvokeAny方法:
public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException { try { //委托给doInvokeAny return doInvokeAny(tasks, false, 0); } catch (TimeoutException cannotHappen) { assert false; return null; } } public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { //委托给doInvokeAny return doInvokeAny(tasks, true, unit.toNanos(timeout)); } /** * the main mechanics of invokeAny. */ private <T> T doInvokeAny(Collection<? extends Callable<T>> tasks, boolean timed, long nanos) throws InterruptedException, ExecutionException, TimeoutException { if (tasks == null) throw new NullPointerException(); int ntasks = tasks.size(); if (ntasks == 0) throw new IllegalArgumentException(); List<Future<T>> futures= new ArrayList<Future<T>>(ntasks); ExecutorCompletionService<T> ecs = new ExecutorCompletionService<T>(this); // For efficiency, especially in executors with limited // parallelism, check to see if previously submitted tasks are // done before submitting more of them. This interleaving // plus the exception mechanics account for messiness of main // loop. //此方法,在执行器并行执行线程数有限制场景总,在提交更多的任务之前, //需要确认先前提交的任务已经执行结束,机制的主要实现在主循环中 try { // Record exceptions so that if we fail to obtain any // result, we can throw the last exception we got. //记录异常,如果我们获取任意结果失败,我们可以抛出,记录的最后异常 ExecutionException ee = null; long lastTime = timed ? System.nanoTime() : 0; Iterator<? extends Callable<T>> it = tasks.iterator(); // Start one task for sure; the rest incrementally //确保有一个任务在执行,余下的自动增长 futures.add(ecs.submit(it.next())); //剩余任务数量自减,任务激活数量赋1 --ntasks; int active = 1; for (;;) { //从完成任务执行器poll一个任务结果,这个我们在ExecutorCompletionService, //那篇文章中,有说,这里不再说 Future<T> f = ecs.poll(); if (f == null) { //如果没有任务完成,则提交任务到执行器,剩余任务数量自减,任务激活数量自增 if (ntasks > 0) { --ntasks; futures.add(ecs.submit(it.next())); ++active; } else if (active == 0) //如果所有任务已经在跑,且激活数量任务数量为0,则跳出自旋 break; else if (timed) { //如果是超时,则超时poll f = ecs.poll(nanos, TimeUnit.NANOSECONDS); if (f == null) throw new TimeoutException(); long now = System.nanoTime(); //重新计算剩余超时时间 nanos -= now - lastTime; lastTime = now; } else //否则,等待任务完成 f = ecs.take(); } if (f != null) { --active; try { //获取任务结果 return f.get(); } catch (ExecutionException eex) { ee = eex; } catch (RuntimeException rex) { ee = new ExecutionException(rex); } } } if (ee == null) ee = new ExecutionException(); throw ee; } finally { for (Future<T> f : futures) //取消完成的任务 f.cancel(true); } }
invokeAny的任务集,主要通过ExecutorCompletionService去执行,
当有任务执行结束时,获取执行结果,并取消其他任务。
总结:
无论是提交Runnable任务,还是Callable都是创建FutureTask执行任务,然后执行,返回结果。执行Callable任务集,遍历任务集合,创建相应的RunnableFuture任务,并添加到结果集;遍历结果集,等待所有任务执行完。超时执行Callable任务集,与非超时执行任务集不同的点是,第一点:在每次执行任务,判断是否超时,超时则返回结果集;第二点:在等待线程任务结束时,为超时等待。invokeAny的任务集,主要通ExecutorCompletionService去执行,当有任务执行结束时,获取执行结果,并取消其他任务。
发表评论
-
Executors解析
2017-04-07 14:38 1202ThreadPoolExecutor解析一(核心线程池数量、线 ... -
ScheduledThreadPoolExecutor解析三(关闭线程池)
2017-04-06 20:52 4408ScheduledThreadPoolExecutor解析一( ... -
ScheduledThreadPoolExecutor解析二(任务调度)
2017-04-06 12:56 2073ScheduledThreadPoolExecutor解析一( ... -
ScheduledThreadPoolExecutor解析一(调度任务,任务队列)
2017-04-04 22:59 4918Executor接口的定义:http://donald-dra ... -
ThreadPoolExecutor解析四(线程池关闭)
2017-04-03 23:02 9036Executor接口的定义:http: ... -
ThreadPoolExecutor解析三(线程池执行提交任务)
2017-04-03 12:06 6028Executor接口的定义:http://donald-dra ... -
ThreadPoolExecutor解析二(线程工厂、工作线程,拒绝策略等)
2017-04-01 17:12 2987Executor接口的定义:http://donald-dra ... -
ThreadPoolExecutor解析一(核心线程池数量、线程池状态等)
2017-03-31 22:01 20465Executor接口的定义:http://donald-dra ... -
ScheduledExecutorService接口定义
2017-03-29 12:53 1454Executor接口的定义:http://donald-dra ... -
ExecutorCompletionService解析
2017-03-28 14:27 1523Executor接口的定义:http://donald-dra ... -
CompletionService接口定义
2017-03-28 12:39 1008Executor接口的定义:http://donald-dra ... -
FutureTask解析
2017-03-27 12:59 1279package java.util.concurrent; ... -
Future接口定义
2017-03-26 09:40 1128/* * Written by Doug Lea with ... -
ExecutorService接口定义
2017-03-25 22:14 1114Executor接口的定义:http://donald-dra ... -
Executor接口的定义
2017-03-24 23:24 1600package java.util.concurrent; ... -
简单测试线程池拒绝执行任务策略
2017-03-24 22:37 1963线程池多余任务的拒绝执行策略有四中,分别是直接丢弃任务Disc ... -
JAVA集合类简单综述
2017-03-23 22:51 875Queue接口定义:http://donald-draper. ... -
DelayQueue解析
2017-03-23 11:00 1681Queue接口定义:http://donald-draper. ... -
SynchronousQueue解析下-TransferQueue
2017-03-22 22:20 2088Queue接口定义:http://donald-draper. ... -
SynchronousQueue解析上-TransferStack
2017-03-21 22:08 3010Queue接口定义:http://donald-draper. ...
相关推荐
3_AbstractExecutorService源码阅读1
抽象类 AbstractExecutorService 主要对公共行为 submit()系列方法进行了实现,这些 submit()方法 的实现使用了 模板方法模式,其中调用的 execute()方法 是未实现的 来自 Executor 接口 的方法。实现类 ...
引子 线程的创建和销毁比较消耗资源,所以有一种更加高效快捷的方式管理线程—-线程池。 先来看一下线程池的java模型 Executor:线程池顶级接口,...AbstractExecutorService:基本实现了ExecutorService的所有方法 Th
智慧物流医药物流落地解决方案qytp.pptx
JAVA物业管理系统设计与实现
基于java的聊天系统的设计于实现
vueVue数字孪生可视化建模系统源码.zip vueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zip
基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip
基于知识图谱和推荐系统的药物靶标相互作用预测python源码(含操作说明).zip个人经导师指导并认可通过的98分大作业设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。 基于知识图谱和推荐系统的药物靶标相互作用预测python源码(含操作说明).zip个人经导师指导并认可通过的98分大作业设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。 基于知识图谱和推荐系统的药物靶标相互作用预测python源码(含操作说明).zip个人经导师指导并认可通过的98分大作业设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。 基于知识图谱和推荐系统的药物靶标相互作用预测python源码(含操作说明).zip个人经导师指导并认可通过的98分大作业设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。 基于知识图谱和推荐系统的药物靶标相互作用预测python源码(含操作说明).zip个人经导师指导并认可通过的98分大作业设计项目
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
JAVA基于SNMP网络设备MIB信息采集
麦肯锡_xx员工发展咨询报告gltp.pptx
这个是一个JSP手机商城管理系统,管理员角色包含以下功能:管理员登录,订单管理,客户管理,手机管理,类目管理,debug等功能。用户角色包含以下功能:查看首页,用户登录,修改个人信息,按分类查看手机,查看热销手机,查看商品详情,查看我的购物车,提交订单,查看我的订单等功能。 本项目实现的最终作用是基于JSP手机商城管理系统 分为2个角色 第1个角色为管理员角色,实现了如下功能: - 客户管理 - 手机管理 - 管理员登录 - 类目管理 - 订单管理 第2个角色为用户角色,实现了如下功能: - 修改个人信息 - 按分类查看手机 - 提交订单 - 查看商品详情 - 查看我的订单 - 查看我的购物车 - 查看热销手机 - 查看首页 - 用户登录
麦肯锡_xx保险薪酬改革咨询报告gltp.pptx
流程优化方法课件zz.pptx
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。