1.1线程相关概念
1.1.1进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位。
可以简单的理解为进程就是操作系统中正在运行的一个程序
线程(Thread)是进程的一个执行单元
一个线程就是进程中的一个单一顺序的控制流,进程的一个执行分支
进程是线程的容器,一个进程至少有一个线程,一个进程也可以有多个线程
在操作系统中是以进程为单位分配资源,如虚拟存储空间,文件描述符等
每个线程都有各自的线程栈,自己的线程本地存储。
主线程与子线程
JVM启动时会创建一个主线程,该主线程负责执行main方法,主线程就是运行main方法的线程。
java中的线程不是孤立的,线程之间存在一些联系,如果线程A 创建了线程B,那么线程A为父线程,线程B为子线程。
串行与并发
串行(Seqential):所有任务逐个完成(一个任务结束后才开始下一个任务)
并发(Concurrent)任务交替执行(在等待任务A 完成的过程中,任务B就开始执行了)
并行(Parallel)所有任务同时开始执行,以最后那个完成的任务的结束为结束,总耗时取决于最后完成的那个任务的执行时间
并发可以提高对事务的处理效率,
并行是一种更为严格,理想的并发
从硬件的角度来说:
如果是单核CPU,一个处理器一次只能执行一个线程的情况下,处理器可以使用时间片轮转技术,可以让CPU快速的在各个线程之间进行切换,对于用户来说,感觉多个线程在同时执行。
如果是多核CPU,可以在不容的线程中分配给不容的CPU内核。
线程的创建与启动:
在java中创建一个线程就是创建一个Thread类的对象(实例化)。
Thread类中有两个常用的构造方法 Thread()和 Thread(Runnable)
对应创建线程的两种方式
1.定义一个Thread类的子类
2. 定义一个Runnable接口的实现类
这两种创建线程的方式没有本质上的区别。
代码:
/**
* 创建一个线程
* 1.定义一个类继承Thread
* 2.重写父类Thread的run方法(run()方法体中的代码就是子线程要执行的任务)
* 3.创建子线程对象
* 4.启动线程
*/
public class MyThread extends Thread{
@Override
public void run() {
super.run();
System.out.println("这是子线程的内容");
}
}
测试类:
package threadTest;
public class Test {
public static void main(String[] args) {
System.out.println("JVM启动main线程,main线程执行main方法");
//创建子线程对象
MyThread myThread = new MyThread();
//调用线程的start()方法来启动线程
//启动线程的实质就是请求JVM运行相应的线程,线程的运行时机由线程调度器(Scheduler)决定
//注意:start()方法调用结束并不意味着子线程开始运行
//新开启的线程会执行run()方法
//如果我们开启了多个线程,start()调动的顺序并不一定是线程启动的顺序
myThread.start();
System.out.println("main线程后面其他的代码。。。");
}
}
运行结果:
JVM启动main线程,main线程执行main方法
main线程后面其他的代码。。。
这是子线程的内容
Process finished with exit code 0