通过一个实例来演示:
/**
* 线程池
* 线程池是线程的管理机制,它主要解决两方面的问题:
* 1:复用线程
* 2:控制线程数量
*/
public class ThreadPoolDemo {
public static void main(String[] args) {
/*
JUC是什么?java.util.concurrent这个包
concurrent并发
java的并发包,里面都是与多线程相关的API。线程池就在这个包里
*/
//创建一个固定大小的线程池,容量为2
ExecutorService threadPool = Executors.newFixedThreadPool(2);
for(int i=0;i<5;i++){
Runnable r = new Runnable() {
@Override
public void run() {
Thread t = Thread.currentThread();
System.out.println(t.getName()+"正在执行一个任务");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
System.out.println(t.getName()+"执行一个任务完毕");
}
};
threadPool.execute(r);
System.out.println("交给线程池一个任务...");
}
/*
关闭线程的两个操作:
shutdown()
该方法调用后,线程不再接受新任务,如果此时还调用execute()就会抛出异常
并且线程池会继续将已经存在的任务全部执行完毕后才会关闭。
shutdownNow()
强制中断所有线程,来停止线程池。
*/
threadPool.shutdown();
System.out.println("线程池关闭了!");
}
}
重定向:
重定向及内部跳转的含义:
内部跳转:特点:一次请求完成所有操作
重定向:
特点:两次请求完成所有操作
好处:避免表单的重复提交。减少服务端不必要的开销。
重定向的规则:
响应中的状态代码为302
响应头中应包含Location
没有响应正文
重新定向的类:
/**
* 使浏览器重新定向到指定位置
* @param location
*/
public void sendRedirect(String location){
this.statusCode = 302;
this.statusReason = "Moved Temporarily";
addHeader("Location",location);
}
运用定向类:
首先判断是不是"/myweb/reg"的注册应用
1,未定向之前执行注册应用,注册页面地址一直是http://localhost:8088/myweb/reg.html,点击注册后显示注册成功页面,此页面地址是http://localhost:8088/myweb/reg。此时在"注册成功"点刷新,会再按照http://localhost:8088/myweb/reg这个地址重新跑一遍。
2,定向之后,执行点击提交http://localhost:8088/myweb/reg之后,出现注册成功页面,此时注册成功页面的地址就是"/myweb/reg_success.html",因为此时在返回"注册成功"页面时不是直接返回页面了,而是系统自己会进行一个调用页面的请求,执行这个代码:response.sendRedirect("/myweb/reg_success.html");,即"http://localhost:8088/myweb/reg_success.html"。此时"注册成功"页面的地址就是"http://localhost:8088/myweb/reg_success.html"。此时再点刷新就是反复执行返回图片功能了
File userFile = new File(userDir,username+".obj"); //-----------------------------------------------------------------------
/*
判断是否为重复用户,若重复用户,则直接响应页面:have_user.html
该页面剧中显示一行字:该用户已存在,请重新注册
*/
if(userFile.exists()){
// File file = new File(staticDir,"/myweb/have_user.html");
// response.setContenFile(file);
response.sendRedirect("/myweb/have_user.html");
return;
}
try (
FileOutputStream fos = new FileOutputStream(userFile);
ObjectOutputStream oos = new ObjectOutputStream(fos);
){
User user = new User(username,password,nickname,age);
oos.writeObject(user);
//注册成功了
// File file = new File(staticDir,"/myweb/reg_success.html");
// response.setContenFile(file);
response.sendRedirect("/myweb/reg_success.html");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}