线程与进程
进程是可并发运行的程序在某个数据集合上的一次计算活动。也是操作系统进行资源分配和调度的基本单位。
线程是操作系统进程中能够并发运行的实体,是处理器调度和分派的基本单位。
每一个进程内可包括多个可并发运行的线程。
线程自己基本不拥有系统资源。仅仅拥有少量不可缺少的资源:程序计数器、一组寄存器、栈。
同属一个进程的线程共享进程所拥有的主存空间和资源。
在传统OS中,拥有资源、独立调度和分派的基本单位都是进程,在引入线程的系统中,线程是调度和分派的基本单位。而进程是拥有资源的基本单位。
在同一个进程内线程切换不会产生进程切换。由一个进程内的线程切换到还有一个进程内的线程时,将会引起进程切换。
线程切换
上下文切换的开销
当CPU从运行一个线程切换到运行另外一个线程的时候,它须要先存储当前线程的本地的数据。程序指针等,然后加载还有一个线程的本地数据,程序指针等,最后才開始运行。
这样的切换称为“上下文切换”(“context switch”)。
CPU会在一个上下文中运行一个线程,然后切换到另外一个上下文中运行另外一个线程。
单线程与多线程
多线程能够提高程序的并行性。能够把任务分开有序运行,有效利用cpu资源,提高响应速度。
可是并不代表它比单线程处理的速度快,在进行密集计算时。单线程的速度要比多线程快些。
多线程的缺点:
1)添加资源消耗
线程在运行的时候须要从计算机里面得到一些资源。除了CPU,线程还须要一些内存来维持它本地的堆栈。
它也须要占用操作系统中一些资源来管理线程。
多个线程在创建和切换时,消耗的时间和资源很多其它
2)多个线程共享1个cpu,须要cpu不停地切换运行线程。
java某些类为什么要实现Serializable接口?
当一个类实现了Serializable接口(该接口仅为标记接口,不包括不论什么方法定义),表示该类能够序列化.序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,能够把该字节序列保存起来(比如:保存在一个文件中),以后能够随时将该字节序列恢复为原来的对象。
序列化能够将内存中的类写入文件或数据库中。比方将某个类序列化后存为文件。下次读取时仅仅需将文件中的数据反序列化就能够将原先的类还原到内存中。也能够将类序列化为流数据进行传输。总的来说就是将一个已经实例化的类转成文件存储,下次须要实例化的时候仅仅要反序列化即可将类实例化到内存中并保留序列化时类中的全部变量和状态。 甚至能够将该字节序列放到其它计算机上或者通过网络传输到其它计算机上恢复,仅仅要该计 算机平台存在对应的类就能够正常恢复为原来的对象。
序列化的实现:将须要被序列化的类实现Serializable接口,该接口没有须要实现的方法,implements Serializable仅仅是为了标注该对象是可被序列化的。然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就能够将參数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
hashmap与hashtable的差别?以及怎样使用。以及他的一些方法?
1、HashMap不是线程安全的
hashmap是一个接口,是map接口的子接口,是将键映射到值的对象,当中键和值都是对象,而且不能包括反复键,但能够包括反复值。
HashMap同意null key和null value,而hashtable不同意。
2、HashTable是线程安全的一个Collection。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完毕了Map接口。主要差别在于HashMap同意空(null)键值(key),由于非线程安全。效率上可能高于Hashtable。HashMap同意将null作为一个entry的key或者value,而Hashtable不同意。 HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。由于contains方法easy让人引起误解。
Hashtable继承自Dictionary类。而HashMap是Java1.2引进的Map接口的一个实现。
最大的不同是。Hashtable的方法是Synchronize的,而HashMap不是,在多个线程訪问Hashtable时。不须要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap採用的hash/rehash算法都大概一样,所以性能不会有非常大的差别。
总结:
hashmap线程不安全 同意有null的键和值 效率高一点、 方法不是Synchronize的,要提供外同步 有containsValue和containsKey方法
hashtable 线程安全 不同意有null的键和值 效率稍低、 方法是Synchronize的 有contains方法方法
Hashtable 继承于Dictionary 类 Hashtable 比HashMap 要旧
HashMap 是Java1.2 引进的Map interface 的一个实现。HashMap是Hashtable的轻量级实现。
利用hashmap对苹果的重量进行排序
一、按key值排序
假设HashMap存储的键-值对为(String,Integer),按key排序能够调用JDK函数sort(默认的按字典升序):
Set keySet = map.keySet();
Collections.sort(keySet);
for(Iterator ite = keySet.iterator(); ite.hasNext();) {
String temp = ite.next();
System.out.println(“key-value: “+temp+”,”+map.getValue(temp);
}
假设想要按字典的降序排列,则需改写sort方法里面的比較器Comparator:
Collections.sort(keySet, new Comparator() {
public int compare(Object o1, Object o2) {
if(Integer.parseInt(o1.toString())>Integer.parseInt(o2.toString())
return 1;
if(Integer.parseInt(o1.toString())==Integer.parseInt(o2.toString())
return 0;
else
return -1;
}
});
二、按value值排序
1)方法一:用两个list链表实现
List keyList = new LinkedList();
keyList.addAll(map.keySet());
List valueList = new LinkedList();
valueList.addAll(map.values());
for(int i=0; i
struts2拦截器
大部分时候,拦截器方法都是通过代理的方式来调用的。
Struts 2的拦截器实现相对简单。
当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并依据其配置实例化相对的拦截器对象,然后串成一个列表(list)。最后一个一个地调用列表中的拦截器。
其实,我们之所以能够如此灵活地使用拦截器。全然归功于“动态代理”的使用。动态代理是代理对象依据客户的需求做出不同的处理。对于客户来说,仅仅要知道一个代理对象即可了。
那Struts2中,拦截器是怎样通过动态代理被调用的呢?当Action请求到来的时候,会由系统的代理生成一个Action的代理对象,由这个代理对象调用Action的execute()或指定的方法,并在struts.xml中查找与该Action对应的拦截器。假设有对应的拦截器,就在Action的方法运行前(后)调用这些拦截器。假设没有对应的拦截器则运行Action的方法。当中系统对于拦截器的调用,是通过ActionInvocation来实现的。
struts2接受參数的方式
1.用Action的属性:
在action 里面定义要接收的參数,并提供对应的setter,getter,和提交參数的名称一致。并不用做数据类型的转换。
对应提交方式能够用get 和post,如:testAction? name=admin
2.使用DomainModel:
在Action 里面不用非常多的属性,而是用Model 层用到的模型,保存它的一个对象。
对应提交方式能够用get 和post,
如:testAction? resBananRc.name=admin
3.使用DTO–传输数据对象
它的作用是接收參数。传递參数,并非项目中的实体类。
如用户注冊时。会用到确认password,所以要先把參数接收过
来,做处理后,再传递给对应方法去创建User 对象。
提交參数的方式的Domain Model 方式的同样。
4.使用ModelDriven:
在创建Action 的时候。Action 实现了ModelDriven 接口。去调用接口的getModel()方法。取到了相关对象。
对应提交方式能够用get 和post,如:testAction? name=admin
5.使用request对象:
此方法与与传统的JSP 等传接參数一样,即使用request. getParameter(“”)方法
Java异常,error和exception
1.Error:全部都继承自Error,表示致命的错误,比方内存不够。字节码不合法等。
Error是程序无法处理的错误,比方OutOfMemoryError、ThreadDeath等。这些异常发生时。Java虚拟机(JVM)通常会选择线程终止。
2.Exception:这个属于应用程序级别的异常,这类异常必须捕捉。
Exception是程序本身能够处理的异常。这样的异常分两大类运行时异常和非运时异常。
MYSQL查看运行状态
1、用命令行的show语句
直接在命令行下登录Mysql,运行show status。
2、用Mysql自带的mysqladmin工具查看status,使用以下命令:mysqladmin -uroot -ppassword status
关于Collection的方法
Servlet的doPost、doGet方法以及一些内置对象
Serlvet接口仅仅定义了一个服务方法就是service。而HttpServlet类实现了该方法而且要求调用下列的方法之中的一个:
doGet:处理GET请求
doPost:处理POST请求
当发出client请求的时候,调用service 方法并传递一个请求和响应对象。Servlet首先推断该请求是GET 操作还是POST 操作。
然后它调用以下的一个方法:doGet 或 doPost。假设请求是GET就调用doGet方法。假设请求是POST就调用doPost方法。doGet和doPost都接受请求(HttpServletRequest)和响应(HttpServletResponse)。
doGet 是接收网页用get方法时调用的
doPost 是用来接收post方法的
get方法就像你在网页的地址栏里看到的一堆乱码,也就是url后面有參数
post就是用表单传过去的,就好象把数据都打成包发过去一样
1.request对象:
client的请求信息被封装在request对象中,通过它才干了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
2.response对象:
response对象包括了响应客户请求的有关信息,但在JSP中非常少直接用到它。它是HttpServletResponse类的实例。
3.session对象:
session对象指的是client与server的一次会话。从client连到server的一个WebApplication開始。直到client与server断开连接为止。它是HttpSession类的实例.
4.out对象:
out对象是JspWriter类的实例,是向client输出内容经常使用的对象
5.page对象:
page对象就是指向当前JSP页面本身,有点像类中的this指针,它是java.lang.Object类的实例
6.application对象:
application对象实现了用户间数据的共享,可存放全局变量。它開始于server的启动。直到server的关闭,在此期间,此对象将一直存在。这样在用户的前后连接或不同用户之间的连接中。能够对此对象的同一属性进行操作;在不论什么地方对此对象属性的操作,都将影响到其它用户对此的訪问。server的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
7.exception对象:
exception对象是一个例外对象。当一个页面在运行过程中发生了例外,就产生这个对象。假设一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
8.pageContext对象:
pageContext对象提供了对JSP页面内全部的对象及名字空间的訪问,也就是说他能够訪问到本页所在的session,也能够取本页面所在的application的某一属性值,他相当于页面中全部功能的集大成者。它的本类名也叫pageContext。
9.config对象:
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的。此信息包括Servlet初始化时所要用到的參数(通过属性名和属性值构成)以及server的有关信息(通过传递一个ServletContext对象)