多任务

  • 边吃饭,边玩手机;
  • 边开车,边打点滴;
  • 边拉粑粑,边玩手机;
    现实中有太多的这样的例子了,看起来是多个任务都是一起同时在做,其实,本质上,我们的大脑,在同一时间依旧只是处理了一件事;

多线程

先看看原来的只有一个线程的方法调用过程:

image.png
整个过程只有一条路线在运行,一个开始,一个结束。

再来看看多线程:

image.png
整个过程有两条路径在运行,一个开始,两个结束,这就是多线程。

进程,线程

  • 进程:操作系统中运行的程序就是进程,比如你的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();
    }
} 

运行结果:
image.png

总结

  • 线程就是独立的执行路径。
  • 在程序运行的时候,即使没有自己创建进程,后台也会有多个线程,如主线程,gc线程等。
  • main()函数称之为主线程,是系统的入口,用于执行整个程序。
  • 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后的顺序不是人为能干预的。
  • 在对同一份资源进行操作时,会存在资源抢夺的问题,需要加入并发的控制。
  • 线程会带来额外的开销,如CPU的调度时间,并发控制的开销。
  • 每个线程在自己的工作内存交互,内存控制不当,会造成数据不一致,错误等情况。