一、线程和进程的简要描述
进程: 是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间 。
线程: 是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少有一个线程 ; 线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分 成若干个线。
注:
进程包含线程,一个进程可能包含一个或者多个线程;一个进程里面的缓存,再这个进程里面的线程可以共享使用。
二、线程缓存池
三种: 长度无限制,长度限制 和 单线程池
2.1、长度无限制
创建步骤,任务加入后的执行流程:
* 2.1.1、判断线程池是否在一个空闲线程
* 2.1.2、存在则使用
* 2.1. 3、不存在,则创建线程,并放入线程池,然后使用
例:
// 同时运行三个线程,第四个等待1秒后运行,会用到空闲的线程执行。通过线程名称查看
public class CacheThreadPool {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();//创建缓存的线程的池
//只会现场池执行新的任务
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"锄禾日当午");
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"锄禾日当午");
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"锄禾日当午");
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
service.execute(new Runnable() {//使用了缓存的线程池执行,线程的重复使用
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"锄禾日当午");
}
});
}
}
------------------------------------------------------------
2.2、定长线程池(长度是只读的数值)
* 创建步骤,任务加入后的执行流程 :
* 2.2. 1.判断线程池是否存在空闲
* 2.存在则使用
* 3.不存在空闲线程,且线程池未满的情况下,则创建线程,并放入线程池,然后使用
* 4.不存在空闲线程,且线程池已满的情况下,则等待线程池存在空闲线程
//创建 两个线程,第三个执行的时候,获取到的线程名称是 ,空闲下来的线程名称。
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(2);//创建两个线程池不允许扩容
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"锄禾日当午1");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"锄禾日当午2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"锄禾日当午3");
}
});
}
-------------------------------
2.3 单线程池
* 执行流程
* 2.3. 1、判断线程池 的那个线程池 是否空闲
* 2.3. 2、空闲则使用
* 2.3. 3、不空闲则等待池中的单个线程池空闲
//创建单线成池,通过线程名字查看
public static void main(String[] args) {
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"锄禾日当午");
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"锄禾日当午");
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"锄禾日当午");
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"锄禾日当午");
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"锄禾日当午");
}
});
}