多任务
- 边吃饭,边玩手机;
- 边开车,边打点滴;
- 边拉粑粑,边玩手机;
现实中有太多的这样的例子了,看起来是多个任务都是一起同时在做,其实,本质上,我们的大脑,在同一时间依旧只是处理了一件事;
多线程
先看看原来的只有一个线程的方法调用过程:
整个过程只有一条路线在运行,一个开始,一个结束。
再来看看多线程:
整个过程有两条路径在运行,一个开始,两个结束,这就是多线程。
进程,线程
- 进程:操作系统中运行的程序就是进程,比如你的QQ,UC浏览器,王者荣耀。。。。。
- 线程:线程就是一个进程中的某一个单独的任务,一个进程中有多个线程,比如:视频中能同时听到声音,看到图像,看到弹幕,这些一个个小任务就是线程。
Process与Thread
- 说到进程,就不得不说一下程序。程序是指令和数据的有序集合,其本身是没有任何运行的含义,只是一个静态的概念。
- 而进程则是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位。
- 通常在一个进程中国可以包含多个线程,当然,一个进程中至少有一个线程,不然没有存在意义了,线程是CPU调度和执行的单位。
PS:值得注意的是,很多多线程都是模拟出来的,真正 的多线程是指有多个CPU,就是我们常说的多核,比如一些强劲的服务器。囚模拟出来的多线程,即在一个CPU的情况下,在同一个时间点,CPU只能执行一段代码,因为切换的时间很快,所以你就有了人为他们在同时执行的错觉,就好比,你吃饭的同时,还玩了手机。
初识并发控制
看看以下这段代码,在没有并发控制的情况下,有同一张票被两个人买走了。
public class TestThread5 implements Runnable {
private int ticktcount = 10;
@Override
public void run() {
while (true) {
if (ticktcount <= 0) {
break;
} else {
try {
//模拟延时
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "买走了第" + ticktcount + "张票!");
ticktcount--;
}
}
}
public static void main(String[] args) {
TestThread5 tickt = new TestThread5();
new Thread(tickt, "小明").start();
new Thread(tickt, "小红").start();
new Thread(tickt, "小刚").start();
}
}
运行结果:
总结
- 线程就是独立的执行路径。
- 在程序运行的时候,即使没有自己创建进程,后台也会有多个线程,如主线程,gc线程等。
- main()函数称之为主线程,是系统的入口,用于执行整个程序。
- 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后的顺序不是人为能干预的。
- 在对同一份资源进行操作时,会存在资源抢夺的问题,需要加入并发的控制。
- 线程会带来额外的开销,如CPU的调度时间,并发控制的开销。
- 每个线程在自己的工作内存交互,内存控制不当,会造成数据不一致,错误等情况。