java中main方法启动的是一个进程还是一个
线程?
答:是一个线程也是一个进程,一个java程序启动后它就是一个进程,进程相当于一个空盒,它只提供资源装载的空间,具体的调度并不是由进程来完成的,而是由线程来完成的。一个java程序从main开始之后,进程启动,为整个程序提供各种资源,而此时将启动一个线程,这个线程就是主线程,它将调度资源,进行具体的操作。Thread、
Runnable的
开启的线程是主线程下的子线程,是父子关系,此时该java程序即为多线程的,这些线程共同进行资源的调度和执行。
每个Java服务启动的时候相当于是启动一个进程,
像日常的
接口项目里面,每次我们请求
controller里的某个接口一次,每一个请求过来进到服务里都会新启一个线程,系统都会新启一个线程,直到这个请求执行完返回给调用端,系统自动释放这个线程,这个算主线程,在这个主线程执行的过程中,如果我们自己再启动新的线程或者我们调用一些别的控件或方法里启动新的线程,这些都是新启动的线程,这些线程和主线程没有任何关系,都是不同的线程。
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在
队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
(1) newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。示例代码如下:
class="java" name="code">public class ThreadPoolExecutorTest {
// main方法执行的时候启动一个main主线程
public static void main(String[] args) {
// 线程池
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index = i;
try {
// 当前现成睡 index*1000毫秒,当前线程为main方法的主线程
Thread.sleep(index * 1000);
// 打印当前代码执行所在的线程名称
System.out.println(Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
// 调用线程池启动一个线程,这个线程是main主线程的子线程
cachedThreadPool.execute(new Runnable() {
public void run() {
// 执行完之后从线程池里拿出来的线程直接就释放了,所以下次循环从线程池拿线程执行这个打印可能用的还是同一个线程
System.out.println(index);
// 打印当前代码执行所在的线程名称(应该是从线程池里拿出来的线程的名称)
System.out.println("========================" + Thread.currentThread().getName());
}
});
}
}
}