🦛
type
status
date
slug
summary
tags
category
icon
password
Property
多线程是Java实现多任务的基础,
Thread
对象代表一个线程,我们可以在代码中调用Thread.currentThread()
获取当前线程。例如,打印日志时,可以同时打印出当前线程的名字:对于多任务,Java标准库提供的线程池可以方便地执行这些任务,同时复用线程。Web应用程序就是典型的多任务应用,每个用户请求页面时,我们都会创建一个任务,类似:
然后,通过线程池去执行这些任务。
观察
process()
方法,它内部需要调用若干其他方法,同时,我们遇到一个问题:如何在一个线程内传递状态?process()
方法需要传递的状态就是User
实例。有的童鞋会想,简单地传入User
就可以了:但是往往一个方法又会调用其他很多方法,这样会导致
User
传递到所有地方:这种在一个线程中,横跨若干方法调用,需要传递的对象,我们通常称之为上下文(Context),它是一种状态,可以是用户身份、任务信息等。
type
status
date
slug
summary
tags
category
icon
password
Property
什么是HTML?怎么开发HTML?怎么运行HTML?
HTML: Hyper Text Markup Language (超文本标记语言)
HTML开发的时候使用普通的文本编辑器就行,创建的文件扩展名是.html或者.htm
HTML也有专业的开发工具,例如:DreamWeaver、HBuilder.....
直接采用浏览器打开HTML文件就是运行
HTML是谁制定的?
W3C:世界万维网联盟
W3C制定了HTML的规范,每个浏览器生产厂家都会遵守规范。HTML程序员也会按照这个规范去写代码。
HTML规范目前最高的版本是:HTML5.0,简称H5.
W3C制定了很多规范:HTML/XML/http协议/https协议......
🦛
type
status
date
slug
summary
tags
category
icon
password
Property
Java的线程锁是可重入的锁。什么是可重入的锁?
观察
synchronized
修饰的add()
方法,一旦线程执行到add()
方法内部,说明它已经获取了当前实例的this
锁。如果传入的n < 0
,将在add()
方法内部调用dec()
方法。由于dec()
方法也需要获取this
锁,现在问题来了:对同一个线程,能否在获取到锁以后继续获取同一个锁?
答案是肯定的。JVM允许同一个线程重复获取同一个锁,这种能被同一个线程反复获取的锁,就叫做可重入锁。
由于Java的线程锁是可重入锁,所以,获取锁的时候,不但要判断是否是第一次获取,还要记录这是第几次获取。每获取一次锁,记录+1,每退出
synchronized
块,记录-1,减到0的时候,才会真正释放锁。死锁
一个线程可以获取一个锁后,再继续获取另一个锁。例如:
在获取多个锁的时候,不同线程获取多个不同对象的锁可能导致死锁。对于上述代码,线程1和线程2如果分别执行
add()
和dec()
方法时:- 线程1:进入
add()
,获得lockA
;
🐼
type
status
date
slug
summary
tags
category
icon
password
Property
队列(
Queue
)是一种经常使用的集合。Queue
实际上是实现了一个先进先出(FIFO:First In First Out)的有序表。它和List
的区别在于,List
可以在任意位置添加和删除元素,而Queue
只有两个操作:- 把元素添加到队列末尾;
- 从队列头部取出元素。
超市的收银台就是一个队列:
在Java的标准库中,队列接口
Queue
定义了以下几个方法:int size()
:获取队列长度;
boolean add(E)
/boolean offer(E)
:添加元素到队尾;
E remove()
/E poll()
:获取队首元素并从队列中删除;
E element()
/E peek()
:获取队首元素但并不从队列中删除。
对于具体的实现类,有的Queue有最大队列长度限制,有的Queue没有。注意到添加、删除和获取队列元素总是有两个方法,这是因为在添加或获取元素失败时,这两个方法的行为是不同的。用一个表格总结如下: