开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
Process与Thread
在介绍Thread之前,首先来了解一下程序,程序就是一个指令和数据的有序集合,它本身没有任何运行的含义,只作为一个静态概念。但是进程是程序执行的过程,与前者相反,进程是一个动态的,是系统分配资源的单位,一般来说,进程中可以包含多个线程,是一对多的关系,注意一个进程至少要有一个线程,否则就没有存在的意义了。
线程是CPU进行调度和执行的单位。很多多线程不是真实存在,而是模拟出来的,也就是只有一个CPU的情况下,在同一时间CPU只能执行一个线程,但是因为CPU切换的很快,在我们看来他就是同时执行的。而真正的多线程是拥有多个CPU,也就是多核,比如服务器,它可以真正的在同一时间不同CPU处理多个线程。
特点
- 线程就是独立的执行路径。
- 不同线程在内存的不同工作区执行,内存控制不当时会出现数据不一致的情况。
- 程序运行时,如果没有创建好线程,底层也会存在多个线程,比如主线程、gc线程等等。
- 一个新的线程会造成额外的消耗,例如cpu的调度时间,并发控制开销等。
- 我们熟知的main()程序的入口用于执行整个程序。
- 资源抢夺常常发生在不同线程针对同一资源进行操作时,这就需要加入并发控制来解决了。
代码示例
// 自定义线程对象,继承Thread,重写run()方法
public class MyThread extends Thread {
public MyThread(String name){
super(name);
}
@Override
public void run() {
// 线程执行体
for (int i = 0; i < 10; i++) {
System.out.println("我是自定义" + Thread.currentThread().getName() + "--" + i);
}
}
public static void main(String[] args) {
// main线程,主线程
// 创建线程实现类对象
MyThread thread = new MyThread("线程1");
MyThread thread2 = new MyThread("线程2");
// 调用start()方法启动线程
thread.start();
thread2.start();
for (int i = 0; i < 10; i++) {
System.out.println("我是主线程--" + i);
}
}
}