前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后也单单执行该代码段而已.因而完全可以把这段代码抽出来,把它定义为类似方法的一串任务代码,这样能够像调用公共方法一样多次调用这段代码,也就无需另外定义新的线程类,只需命令已有的Thread去执行该代码段就好了.在Java中定义某个代码段,则要借助于接口Runnable,它是个函数式接口,唯一需要实现的…
前面介绍了多线程并发之时的资源抢占情况,以及利用同步.加锁.信号量等机制解决资源冲突问题,不过这些机制只适合同一资源的共享分配,并未涉及到某件事由的前因后果.日常生活中,经常存在两个前后关联的事务,像雇员和雇主这两个角色,他们之间的某些工作就带有因果关系.比如要等雇主接到了项目,雇员才有活干:又如每月末员工都等着老板发工资,这样才有钱逛街和吃大餐,此时员工的消费行为便依赖于老板的发薪水动作.如此看来,两个线程之间理应建立某种消息通路,每当线程A完成某个事项,就将完成标志通知线程B,线程B收到通知…
前面提到条件语句的标准格式为“if (条件) { /* 条件成立时的操作代码 */ } else { /* 条件不成立时的操作代码 */ }”,乍看之下仿佛只有两个分支,一个是条件成立时的分支,另一个是条件不成立时的分支.很明显仅仅两个分支是不能满足复杂的业务需求的,自然Java代码也不会这么傻瓜到固步自封,为此else分支还允许嫁接别的if条件,形如“if (条件一) { } else if (条件二) { } else if (条件三) { } else { }”这样,不管来几个条件分支,都…
现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的特种官吏Java开发笔记(四)Java帝国的度量衡 第二章 数值变量Java开发笔记(五)数值变量的类型Java开发笔记(六)特殊数字的表达Java开发笔记(七)强制类型转换的风险 第三章 算术运算Java开发笔记(八)五种算术运算符Java开发笔记(九)赋值运算符及其演化Java开发笔记(十)一元…
前面介绍了如何利用Runnable接口构建线程任务,该方式确实方便了线程代码的复用与共享,然而Runnable不像公共方法那样有返回值,也就无法将线程代码的处理结果传给外部,造成外部既不知晓该线程是否已经执行完毕,也不了解该线程的运算结果是什么,总之无法跟踪分线程的行动踪迹.这里显然是不完美的,调用方法都有返回值,为何通过Runnable启动线程就无法获得返回值呢?为此Java又提供了另一种开启线程的方式,即利用Callable接口构建任务代码,实现该接口需要重写call方法,call方法类似r…
前面介绍了处理字符串的常用方法,还有一种分割字符串的场景也很常见,也就是按照某个规则将字符串切割为若干子串.分割规则通常是指定某个分隔符,根据字符串内部的分隔符将字符串进行分割,例如逗号.空格等等都可以作为字符串的分隔符.正好String类型提供了split方法用于切割字符串,只要字符串变量调用split方法,并把分隔符作为输入参数,该方法即可返回分割好的字符串数组.下面的split调用代码例子演示了如何按照逗号和空格切割字符串: // 通过逗号分割字符串 private static void…
早在介绍多态的时候,曾经提到公鸡实例的性别属性可能被篡改为雌性,不过面向对象的三大特性包含了封装.继承和多态,只要把性别属性设置为private私有级别,也不提供setSex这样的性别修改方法,那么性别属性就被严严实实地封装了起来,不但外部无法修改性别属性,连公鸡类的子类都无法修改.如此一来,公鸡实例的性别属性可谓防护周全,压根不存在被篡改的可能性.但是Java给面向对象留了个后门,也就是反射技术,利用反射技术竟然能够攻破封装的防护网,使得篡改私有属性从理想变成了现实,赶紧来看看反射技术是怎样做…
前面介绍了HTTP协议的网络通信,包括接口调用.文件下载和文件上传,这些功能固然已经覆盖了常见的联网操作,可是HTTP协议拥有专门的通信规则,这些规则一方面有利于维持正常的数据交互,另一方面不可避免地缺少灵活性,比如下列条条框框就难以逾越:1.HTTP连接属于短连接,每次访问操作结束之后,客户端便会关闭本次连接.下次还想访问接口的话,就得重新建立连接,要是频繁发生数据交互的话,反复的连接和断开将造成大量的资源消耗.2.在HTTP连接中,服务端总是被动接收消息,无法主动向客户端推送消息.倘若客户端…
前面介绍了线程的几种运行方式,不管哪种方式,一旦调用了线程实例的start方法,都会立即启动线程的事务处理.然而某些业务场景在事务执行时间方面有特殊需求,例如期望延迟若干时间之后才开始事务运行,又如期望每隔若干时间依次启动事务处理,如此种种都要求在指定的时间才能启动线程任务,也就是俗称的定时功能.有别于一般的线程,Java为定时功能设计了专门的定时任务TimerTask,以及定时器Timer.其中TimerTask用来描述时刻到达后的事务处理,而Timer用来调度定时任务,包括何时启动定时任务.…
前面介绍的所有Java代码,都只能通过日志观察运行情况,就算编译成class文件,也必须在命令行下面运行,这样的程序无疑只能给开发者做调试用,不能拿给一般人使用.因为普通用户早已习惯在窗口界面上操作,哪里还会跑去命令行自讨苦吃呢?所以Java代码写得再好,也得有个软件界面与用户交互,并将程序的处理结果显示在界面上.众所周知,移动开发的Android平台,采用的便是Java语言,此时Java代码的执行结果可直接显示到手机屏幕.对于电脑来说,Java也提供了桌面程序的图形开发工具,它们主要有三组工具…