JAVA构架之并发编程的一些总结

所谓并发编程是指在一台处理器上"同时"处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生。

、程序与进程

程序是一组有序指令的集合,是一种静态的概念。进程是程序的一次执行,属于一种动态的概念。在多道程序环境下,程序的执行属于并发执行,此时它们将失去封闭性,并具有间断性,运行结果也将不可再现,为了能使多个程序可以并发执行,提高资源利用率和系统吞吐量,并且可以对并发执行的程序加以描述和控制,引入进程的概念。

1丶进程和线程

我们知道,为了能使程序能够并发执行,系统必须进行创建进程、撤销进程以及进程切换等操作,而进程作为一个资源的拥有者,在进行这些操作时必须为之付出较大的时空开销。

线程和进程的区别主要如下:(1) 进程是系统中拥有资源的一个基本单位,线程本身并不拥有系统资源,同一进程内的线程共享进程拥有的资源。(2) 进程仅是资源分配的基本单位,线程是调度和分派的基本单位。(3) 线程的并发性更高,可以启动多个线程执行同程序的不同部分。

2丶并行和并发

并行是指两个或多个线程在 同一时刻 执行,并发是指两个或多个线程在 同一时间间隔 内发生。如果程序同时开启的线程数小于CPU的核数,那么不同进程的线程就可以分配给不同的CPU来运行,这就是并行,如果线程数多于CPU的核数,那就需要并发技术。

二、Java多线程

开启的新线程都有一个线程优先级,代表该线程的重要程度,可以通过Thread类的getPriority()和setPriority()来得到或者设置线程的优先级。线程的优先级范围是1~10,默认情况下是5。

在线程创建完成还未启动的时候,我们可以通过方法setDaemon()来将线程设置为守护线程。守护线程,简单理解为后台运行线程,比如当程序运行时播放背景音乐。守护线程与普通线程在写法上基本没有区别,需要注意的是,当进程中所有非守护线程已经结束或者退出的时候,即使还有守护线程在运行,进程仍然将结束。

终止线程?

1、线程自己在run()方法执行完后自动终止

2、调用Thread.stop()方法强迫停止一个线程,不过此方法是不安全的,已经不再建议使用。

3、比较安全可靠的是利用Java的中断机制,使用方法Thread.interrupt()。需要注意的是,通过中断并不能直接终止另一个线程,需要被中断的线程自己处理中断。被终止的线程一定要添加代码对isInterrupted状态进行处理,否则即使代码是死循环的情况下,线程也将永远不会结束。

三、线程安全

线程安全性不是一个非真即假的命题。 Vector 的方法都是同步的,并且 Vector 明确地设计为在多线程环境中工作。但是它的线程安全性是有限制的,即在某些方法之间有状态依赖(类似地,如果在迭代过程中 Vector 被其他线程修改,那么由 Vector.iterator() 返回的 iterator会抛出ConcurrentModifiicationException)。

这类的规格说明所规定的约束在对象被多个线程访问时仍然有效,不管运行时环境如何排线程都不需要任何额外的同步。这种线程安全性保证是很严格的 -- 许多类,如 Hashtable 或者 Vector 都不能满足这种严格的定义。

四、线程池

在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,JVM将试图跟踪每个对象,以便能够在对象销毁后进行垃圾回收。Java线程池实现了一个Java高并发的、多线程的、可管理的统一调度器,减少创建和销毁线程对象的次数。

下面详细介绍一下Java里的线程池技术,首先看一个类Executors,它是线程的工厂类,方便快速地创建很多线程池。配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚地情况下,很有可能配置的线程池不是最优的,因此在Executors类里提供了一些静态工厂,生成一些常用的线程池,常用的方法有:

  • newSingleThreadExecutor()

创建一个单线程的线程池,这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

  • newFixedThreadExecutor()

传入参数nThreads,创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,最多nThreads个线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务。在某个线程被显示地关闭之前,池中的线程将一直存在。

我们查看newFixedThreadExecutor()的实现,可以看到它里面就是实例化了一个ThreadPoolExecutor,ThreadPoolExecutor的构造函数如下:

public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);

从上面代码可以看到几个参数,corePoolSize表示线程池中线程的稳定峰值,maximumPoolSize表示最大处理线程数,workQueue表示线程等待池,另外在线程池中执行的线程列表是存放在workers中的,它的类型是HashSet<Worker>的。

为了让学习变得轻松、高效,今天给大家免费分享一套Java入门教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要资料的欢迎加入学习交流群:9285,05736

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java技术学习心得

1. 学习之路&#xff0c;不走弯路&#xff0c;就是捷径 软件开发之路是充满荆棘与挑战之路,也是充满希望之路。Java学习也是如此&#xff0c;没有捷径可走。所有的人都期盼成功&#xff0c;但是并不是每个人都会为走向 成功全力以赴。人们在渴望成功的同时&#xff0c;也渴望能…

做到年薪50W是如何学习Java架构技术的?

工作年时间长&#xff0c;经验比较丰富 他们的共同特点是&#xff1a;10 年以上的工作经验&#xff0c;在大公司当过螺丝钉&#xff0c;也在创业公司做过技术 leader&#xff0c;有过一两段不算成功的创业经历。 这样的程序员无论是去 BAT 还是去创业公司&#xff0c;都能拿到…

Java程序员该如何学习才能成长为一名优秀的架构师

Java架构师&#xff0c;首先要是一个Java程序员&#xff0c;熟练掌握使用各种框架&#xff0c;并知道它们实现的原理&#xff0c;Java虚拟机原理、调优&#xff0c;懂得JVM能让你写出性能更好的代码&#xff0c;池技术&#xff0c;什么对象池&#xff0c;怎么解决并发量、连接池…

java程序员应该掌握的技术才算得上熟练Java开发

1.语法&#xff1a;Java程序员必须熟悉语法。编写代码时&#xff0c;IDE编辑器应该能够根据错误消息报告行错误&#xff0c;并知道什么样的语法错误并知道任何更正。 2&#xff0c;命令&#xff1a;必须熟悉JDK带来的一些常用命令和常用选项&#xff0c;该命令至少需要熟悉&am…

2019年Java初级和高级部分的技术面试

事实上&#xff0c;并不是我故意想成为一个困难的候选人。毕竟&#xff0c;在我加入这份工作后&#xff0c;我是一名同事&#xff0c;但面试官的角色是&#xff0c;如果高级面试官一般都是一样的话。 如果你在这里写&#xff0c;我担心一些想面试的朋友会害怕。如果他们有很强…

2019年Java编程开发值得学习的10大技术

01 Gradle Java世界中主要有三大构建工具&#xff1a;Ant、Maven和Gradle。经过几年的发展&#xff0c;Ant几乎销声匿迹&#xff0c;还剩Maven和Gradle两种&#xff0c;maven是我目前工作中用的版本管理工具。maven现在已经是行业标准&#xff0c;Gradle算是后起之秀&#xff…

Java编程学习中必须掌握的13个核心技术

1. JDBC(Java Database Connectivity)&#xff1a; JDBC API为访问不同的数据库提供了一种统一的途径象ODBC一样&#xff0c;JDBC对开发者屏蔽了一些细节问题&#xff0c;另外JDCB对数据库的访问也具有平台无关性。 2. JNDI(Java Name and Directory Interface)&#xff1a; …

让你脱胎成技术大神的JAVA开发技巧

开发过程中&#xff0c;那些被称为“666”的大神&#xff0c;领先你的&#xff0c;往往也只有几个快捷键的距离。一些简单的技巧和开发习惯&#xff0c;往往能让你在开发过程中事半功倍。 避免重复创建对象 为什么&#xff1f; 更少的对象会需要更少的垃圾回收 使用的空间越…

Java大牛分享的面试知识点

1.基本部分 无论使用哪种编程语言&#xff0c;基础始终是您不能忽视的部分。以下是经常出现的十点&#xff0c;当然最好熟悉。 使用length属性获取数组的长度&#xff0c;public&#xff0c;private&#xff0c;protected&#xff0c;friendly。 计算2 * 8的最有效方法是等于…

看Java大牛是如何高效学习的?你掌握好这些了吗?

1. 能够认清自己 一个技术专家&#xff0c;年龄不是那么可怕&#xff0c;可怕的是你不符合他们的年龄技术深度。当你把你的工作换成一个刚刚毕业的人&#xff0c;你很快就会被淘汰。所以&#xff0c;你必须选择你感兴趣的方向&#xff0c;因为只有这样&#xff0c;你才有兴趣深…

Java大牛的一些总结,献给对未来还在迷茫中的你!

恍然间&#xff0c;发现自己在这个行业里已经摸爬滚打了五年了&#xff0c;原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了&#xff0c;但是今年在换工作的过程中却遭到了重大的挫折。详细过程我就不再叙述&#xff0c;在此&#xff0c;…

java初学者只要掌握了以下十大原则,可以让你的技术飙升

1. 将一些需要变动的配置写在属性文件中 比如&#xff0c;没有把一些需要并发执行时使用的线程数设置成可在属性文件中配置。那么你的程序无论在DEV环境中&#xff0c;还是TEST环境中&#xff0c;都可以顺畅无阻地运行&#xff0c;但是一旦部署在PROD上&#xff0c;把它作为多…

一位资深程序员大牛给Java初学者的学习建议

糖糖发现最近很多想要学习Java的小白或者转行到Java这个行业的伙伴们不知道怎样学习才能学得更多专业&#xff0c;今天糖糖给大家整理了一些前辈们的学习方法和技巧&#xff0c;以及常看的一些书籍。这些也非常适合初入Java行业的伙伴们。咱们就来一起看看。 首选对于在校的一…

Java学习的5个阶段,助大家步步攀升

第一阶段&#xff1a;基础阶段&#xff08;Java基础&#xff09; 你将要在这个阶段学会的技能&#xff1a; 软件行业信息了解、 java的魅力和安装、 变量、 常量、 算术、 关系、 逻辑、 三目、 if else、 switch、 while、 for、 for高级、 do while、 方法、 方法算法、 封…

java学习明确的路线规划奉上,助大家进阶

1.刚开始需要知道什么 Java SE是我们Java入门的开端&#xff0c;是Java学习的基石&#xff0c;这块内容也就是大家所熟悉的坦克大战、聊天软件、五子棋这些桌面级项目所组成的。学完了Java SE部分&#xff0c;接下来就该选择方向了。 2. Java SE中应该关注的内容 下面我们将…

深入理解Java中的位操作

与、或、非、位移 原码、反码、补码 字节、位、超区间...... 开始本章节之前&#xff0c;我们先思考一个问题&#xff1a; byte a 33; byte b -3;若我们输出a、b的二进制字符串是多少&#xff1f; 答案是这样的么&#xff1f; a->// 00100001 b->// 10100001当然…

同样是Java程序员,如何比别人更优秀?

随着互联网时代的飞速发展&#xff0c;越来越多的人投身于软件开发行业&#xff0c;大家都称他们为程序员&#xff0c;或者码农。 这些程序员的水平也是参差不齐的&#xff0c;有些人从比较好的学校毕业&#xff0c;水平却一般般&#xff1b;也有些人从一般搬的学校毕业&#…

初学Java编程经常遇到的问题,你们遇到过吗?

随着互联网时代的飞速发展&#xff0c;越来越多的人投身于软件开发行业&#xff0c;大家都称他们为程序员&#xff0c;或者码农。 这些程序员的水平也是参差不齐的&#xff0c;有些人从比较好的学校毕业&#xff0c;水平却一般般&#xff1b;也有些人从一般搬的学校毕业&#…

Java技术学习笔记:C/S 与B/S 区别

C/S 是Client/Server 的缩写&#xff0c;是客户机与服务器结构的应用程序&#xff0c;服务器通常采用高性能的PC、工作站或小型机&#xff0c;并采用大型数据库系统&#xff0c;如Oracle、Sybase、Informix 或SQL Server。客户端需要安装专用的客户端软件。 B/&#xff33;是B…

学习Java编程equals()和hashCode()方法

equals()和hashCode()区别&#xff1f; equals()&#xff1a;反映的是对象或变量具体的值&#xff0c;即两个对象里面包含的值--可能是对象的引用&#xff0c;也可能是值类型的值。 hashCode()&#xff1a;计算出对象实例的哈希码&#xff0c;并返回哈希码&#xff0c;又称为…