首页 文章 精选 留言 我的

精选列表

搜索[JDK 25],共10000篇文章
优秀的个人博客,低调大师

JDK5.0新特性系列---11.2线程 任务执行架构

import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** 在J2SE之前启动一个任务是通过调用Thread类的start方法来实现的,任务的提交和执行是同时进行的,如果想对任务的执行进行调度,或是控制同时执行的线程数量就需要额外的编写代码来完成. J2SE5.0提供了一个新的任务执行架构,可以轻松地高度和控制任务的执行,并且可以建立一个线程池来执行任务. 实例介绍如何使用新的任务执行架构,运行Runnable和Callable任务,包括定时执行任务,按规律执行任务和停止任务. 关键技术剖析: 使用新的任务执行框架的关键技术如下: 1.Executor服务对象是用来执行Runnable任务的,常用的方法如下: execute方法用于执行Runnable类型的任务. 2.ExecutorService服务对象能执行和终止Callable任务,它继承了Executor,所以也能执行Runnable任务.常用的方法如下 a) submit方法用来提交Callable或Runnable任务,并返回代表此任务的Future对象. b) invokeAll方法批处理任务集合,并返回一个代表这些任务的Future对象集合 c) shutdown方法在完成自己已提交的任务后关闭服务,不再接受新任务. d) shutdownNow方法停止所有正在执行的任务并关闭服务. e) isTerminated测试是否所有任务都执行完毕了 g) isShutdown测试是否该ExecutorService已被关闭 3.ScheduledExecutorService服务对象继承ExecutorService,提供了按时间安排执行任务的功能.常用的方法如下: a)schedule(task,initDelay)方法安排所提交的Callable或Runnable任务在initDelay指定的时间后执行. b)scheduleAtFixedRate方法安排所提交的Runnable任务按指定的间隔重复执行. c)scheduleWithFixedDelay方法安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行. 4.Executors类用来创建各种服务对象,常用的方法如下: a)callable(Runnable task)方法将Runnable的任务转化成Callable的任务. b)newSingleThreadExecutor方法产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用. c)newCachedThreadPool方法会产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用. d)newFixedThreadPool(int poolSize)方法产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池,若任务数量大于poolSize,任务会被放在一个队列里顺序执行. e)newSingleThreadScheduledExecutor方法产生一个ScheduledExecutorService对象,这个对象的线程池大小为1,若任务多于一个,任务将按先后顺序执行. f)newScheduledThreadPool(int poolSize)方法产生一个ScheduledExecutorService对象,这个对象的线程池大小为poolSize,若任务数量大于poolSize,任务会在一个队列里等待执行. */ public class ExecuteArch { /**该线程输出一行字符串*/ public static class MyThread implements Runnable{ public void run(){ System.out.println("Task repeating. " + System.currentTimeMillis()); try{ Thread.sleep(1000); }catch(InterruptedException e){ System.out.println("Task interrupted. " + System.currentTimeMillis()); } } } /**该Callable结束另一个任务*/ public static class MyCallable implements Callable{ private Future future; public MyCallable(Future future){ this.future = future; } public String call(){ System.out.println("To cancell Task..." + System.currentTimeMillis()); this.future.cancel(true); return "Task cancelled!"; } } public static void main(String... args)throwsInterruptedException,ExecutionException{ //产生一个ExcutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整 //线程执行完任务后返回线程池,供执行下一次任务使用 ExecutorService cachedService = Executors.newCachedThreadPool(); Future myThreadFuture = cachedService.submit(new MyThread()); Future myCallableFuture = cachedService.submit(newMyCallable(myThreadFuture)); System.out.println(myCallableFuture.get()); System.out.println("--------------------"); //将Runnable任务转换成 Callable任务 Callable myThreadCallable = Executors.callable(new MyThread()); Future myThreadCallableFuture = cachedService.submit(myThreadCallable); //对于Runnable任务,转换成Callable任务后,也没有返回值 System.out.println(myThreadCallableFuture.get()); cachedService.shutdownNow(); System.out.println("--------------------"); //产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池 //若任务大于poolSize,任务会被放在一个queue里顺序执行 ExecutorService fixedService = Executors.newFixedThreadPool(2); fixedService.submit(new MyThread()); fixedService.submit(new MyThread()); //由于线程池大小为2,所以后面的任务必须等待前面的任务执行完毕后才能被执行 myThreadFuture = fixedService.submit(new MyThread()); myThreadFuture = fixedService.submit(new MyCallable(myThreadFuture)); System.out.println(myCallableFuture.get()); fixedService.shutdown(); System.out.println("--------------------"); //产生一个ScheduleExecutorService对象,这个对象的线程池大小为poolSize //若任务数量大于poolSize,任务会在一个queue里等待执行 ScheduledExecutorService fixedScheduledService = Executors.newScheduledThreadPool(2); MyThread task1 = new MyThread(); //使用任务执行服务立即执行任务1,而且此后每隔2秒执行一次任务1 myThreadFuture = fixedScheduledService.scheduleAtFixedRate(task1, 0, 2, TimeUnit.SECONDS); MyCallable task2 = new MyCallable(myThreadFuture); //使用任务执行服务等待5秒后执行任务2,执行它后将任务1关闭. myCallableFuture = fixedScheduledService.schedule(task2,5,TimeUnit.SECONDS); System.out.println(myCallableFuture.get()); fixedScheduledService.shutdownNow(); } } 本文转自远哥博客园博客,原文链接:http://www.cnblogs.com/taven/archive/2011/12/17/2291469.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

前端构建神器 Parcel 大「瘦身」:依赖项削减 25%,安装体积砍半!

在前端工具链百花齐放的今天,知名构建工具Parcel带来了令人振奋的2.15.0版本更新。最让开发者兴奋的是:通过将核心功能改用Rust重写,新版本在保持全部功能的同时,node_modules体积直接砍掉近一半,依赖包数量也减少了四分之一。这对于那些被庞大node_modules文件夹困扰的开发者来说无疑是一剂强心针。 拥抱「重型武器」,构建再也不担心翻车 本次更新最大的亮点是HTML处理链路的彻底重构。Parcel团队放弃了此前使用的PostHTML方案。PostHTML是什么?简单来说,它是一个用JavaScript编写的HTML处理工具,通过插件机制来完成HTML的解析和转换。虽然PostHTML生态丰富,有着大量现成的插件可用,但其解析能力始终无法企及浏览器级别。 为了彻底解决这个问题,Parcel团队转向了「重型武器」——直接搬来了Firefox浏览器和Servo渲染引擎中的核心组件,用Rust语言重新打造了HTML处理模块。这就好比之前用的是「民用工具」,现在换成了「工业级设备」,解析准确性得到了质的飞跃。 举个例子:HTML规范中关于解析的部分竟然有100多页之厚,里面包含了20多年来Web发展过程中积累的各种特殊情况。普通的解析器很难完美处理这些边界情况,但浏览器级的解析引擎在这方面已经过了无数实战检验。新版本采用Servo的html5ever解析器,意味着你的HTML文件将获得与Chrome、Firefox等主流浏览器完全一致的解析结果。 更保守但更聪明的压缩策略 在代码压缩方面,新版本的做法很有意思。与其他动辄追求极致压缩率的工具不同,Parcel选择了更明智的「保守压缩」策略。比如说,过去很多工具都会激进地删除HTML中的空白字符,但实际上这可能会破坏页面样式,因为CSS中的white-space: pre属性就需要保留这些空白。新版本在这类情况下会谨慎处理,宁可多留一些空白,也不破坏页面效果。 不过,在安全的优化场景下,新版本反而比之前更加智能。它能智能判断何时可以安全地移除属性引号、删除布尔属性的值,甚至利用HTML的容错机制移除一些可选的闭合标签。这些优化既保证了页面完整性,又能带来一定的体积收益。 SVG处理也来了次大换血 SVG处理模块同样迎来重大升级。新版本引入了名为OXVG的Rust工具替代了原有的SVGO。测试显示,这一替换带来了数倍的性能提升。同时,得益于与新HTML解析器的无缝配合,现在处理网页中的内嵌SVG图标也变得更加高效可靠。 对于经常和React打交道的开发者来说,还有一个好消息:新版本重写了SVG转JSX的功能,直接将SVG转换为JavaScript语法树,省去了中间环节,处理效率得到显著提升。 新版本值得升级吗? 答案是肯定的。如果你正在使用Parcel,升级到2.15.0版本将带来立竿见影的收益:更小的项目体积、更快的安装速度、更可靠的构建结果。而且,为了照顾现有项目,新版本保留了对PostHTML插件和SVGO配置的兼容支持,升级过程几乎不会带来任何副作用。 在当前前端工具链百家争鸣的背景下,Parcel用这次更新展示了一个颇具前瞻性的发展方向:用更可靠的系统级语言重写核心功能,同时保持与现有生态的友好共存。这种演进思路值得其他工具借鉴。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册