进程与线程
进程是什么?线程又是什么?
我们可以打开电脑的任务管理器来看看:

可以看到这里有很多程序在运行,那么,简单来说,一个程序就是一个进程。我们的计算机是支持多进程的。假如,计算机只支持单进程,那对于使用计算机的人们来说将是毁灭性的。比如,如果你想看在电脑上视频,那你就只能看视频,不能听歌,不能聊天,不能使用这台电脑干除看视频以外的任何事情。
这里好像有点含糊,我们来看看某知乎大佬的专业解释:


其实呢,进程就是程序的一次执行过程。
那什么是线程呢?在程序里面来看,我写了很多个方法,那么如果就是这么按部就班的一行一行地去运行这个程序,那么这就是单线程的,在这篇文章发表时间以前的所有文章里面的程序运行起来都是单线程的,而程序是可以多线程运行的。
举个通俗易懂的例子(例如上面那张图):
进程好比火车,而线程就好比车厢。线程在进程下运行。一个进程可以包含多个线程,这就相当于一辆火车里面有多间车厢。不同进程间的数据是很难共享的,这就好比一辆火车上的乘客是很难换到另外一辆火车上的(当然除了站点换乘哈)。进程间不会互相影响,但一个线程关键时刻掉链子会导致整个进程狗带,例如火车内某一节车厢发生火灾,这整辆火车都得受到影响。
并发与并行(半年后补充):
并发的关键是你有处理多个任务的能力,不一定要同时。(单纯地有这个能力就行了)
并行的关键是你有同时处理多个任务的能力。
它们虽然都说是"多个进程同时运行",但是它们的"同时"不是一个概念。并行的"同时"是同一时刻可以多个进程在运行(处于running),并发的"同时"是经过上下文快速切换,使得看上去多个进程同时都在运行的现象,是一种OS欺骗用户的现象。
所以它们最关键的点可以理解为:是否是『同时』。
我们可以在代码中体会一下:
DemoTestThread.java文件:
1 package com.hw.thread0223; 2 3 public class DemoTestThread { 4 public static void main(String[] args) { 5 MyThread thread = new MyThread(); 6 thread.run(); 7 } 8 }
MyThread.java文件:
1 package com.hw.thread0223; 2 3 public class MyThread extends Thread{ 4 public void run(){ 5 for(int i = 0;i < 1000;i++) 6 { 7 System.out.println("MyThread:"+i); 8 } 9 } 10 }
如果就是这样的话呢,那么这个程序就是单线程的,来看看输出结果(这里只截取部分运行结果):

但是,我如果在主方法中这么改一下,那么就变成多线程了:
1 package com.hw.thread0223;
2
3 public class DemoTestThread {
4 public static void main(String[] args) {
5 MyThread thread = new MyThread();
6 thread.start();
7
8 for(int i = 0;i < 1000;i++)
9 {
10 System.out.println("MyMain:"+i);
11 }
12 }
13 }

可以看到,这两个是同时运行的。(之前都是单独运行的,运行完这个再运行那个)
这里完善一下前面所说的:
进程是在CPU上运行的,而一个进程里面,包含了至少一个线程,这么多线程,难道CPU真的是同时运行的吗?这是不可能的,CPU在某一段时间里只能运行一个线程。但是,CPU处理的速度是非常快的,快到你根本看不到。因此,表面上看上去好像是同时运行的,但是其实对于多个线程,CPU是为线程们分配了时间的,某一段时间里运行这个线程,另外一段时间里就去运行另外一个线程,挨个挨个运行。那么这样一来,从整体上来看,就好像每一个线程都在运行。总的来说,CPU为每一个线程分配一定的时间片,再去运行它。
线程的调度规则:
第一种是分时调度,意思就是大家的时间都是平均分配的。第二种是抢占式调度。抢占式调度是按照优先级来的,优先级可以设置,一般来说,优先级更高的更有可能被CPU执行。Java里面采取的就是抢占式调度。

浙公网安备 33010602011771号