秋招知识点总结——多线程

    科技2024-02-20  106

    1.线程和进程

    这是一个很基础的知识点,考察的是对基础的掌握情况

    进程 是系统进行资源分配和调度的一个独立单位线程 是进程的一个实体,一个进程中拥有多个线程,线程之间共享地址空间和其它资源

    进一步的,我们需要知道二者的区别,即为啥要多线程?

    原因是:线程上下文的切换比进程上下文切换快

    原理是因为:线程切换仅需要保存和设置少量的寄存器内容,而进程之间的切换;涉及到当前进程的 CPU 环境的保存和新被调度运行进程的 CPU 环境的设置。

    拓展问题:进程之间如何通信?线程之间如何通信?

    进程之间依靠 管道(pipes) 或者 套接字(sockets) 等IPC进行通信线程之间依靠 JVM 提供的 API,例如 wait()、notify()、notifyAll() 等进行通信

    2.为什么要用多线程

    很多人包括我在内初学多线程时,都会误以为这个问题的回答 就是 多线程速度快效率高 其实不止这一点,如果你对多线程的特点只能想到这一点,那么说明对于这个问题的理解还不够透彻。

    首先我们要明确一点,多线程也是有很多隐患的,不是十全十美的。

    (1)资源利用率高

    它可以充分的将各个模块都使用起来,我们可以理解为 流水线的工作

    举个例子:我们对本地文件的处理过程;

    1.读取本地文件A 2S 2.复制本地文件A到新地址 2S 3.删除原地址的本地文件A 2S 4.读取本地文件B 2S 5.复制本地文件B到新地址 2S 6.删除原地址的本地文件B 2S 总计用时 12S

    但是如果我们采用多线程的方法来做的话:

    1.读取本地文件A 2S 2.复制本地文件A到新地址 读取本地文件B 2S 3.删除原地址的本地文件A 复制本地文件B到新地址 2S 4. 删除原地址的本地文件B 2S 总计时间 8S

    类比一下,如果工作量十分庞大的话,多线程在资源利用率上的优势会更加显著

    (2)程序设计可能会变得简单

    在单线程应用程序中,如果你想编写程序手动处理上面所提到的处理顺序,你必须记录每个文件处理的状态;

    但是多线程的话,你可以启动两个线程,每个线程处理一个文件的操作。线程会在等待磁盘读取文件的过程中被阻塞;

    其他的线程能够使用CPU去处理以及读取过的文件,进行后续操作;

    其结果就是,磁盘总是在繁忙地读取不同的文件到内存中。这会带来磁盘和CPU利用率的提升。而且每个线程只需要记录一个文件,因此这种方式也很容易编程实现。

    (3)程序速度快

    对数据进行处理时,我们可以将部分操作分配给其他线程,同步进行;

    这里我们可以参考一下统筹法的思想:

    例如:早上起床,想泡壶茶喝。 当时情况是:开水没有,开水壶、茶壶、茶杯要洗,火已升了,茶叶也有了,怎么办?

    方法一 洗水壶,灌水,放在火上;等水烧开的时间,洗茶壶、茶杯,放茶叶;等水烧开了,泡茶喝。

    方法二 洗水壶,洗茶壶、茶杯,放茶叶;灌水,放在火上;等水烧开了,泡茶喝。

    显然方法一更快一些,这就是多线程的好处。

    注意点:多线程不一定是最快的,因为线程有创建和上下文切换的开销。

    3.线程的状态

    图片转自:http://zy19982004.iteye.com/blog/1626916 未完待续。。。

    Processed: 0.016, SQL: 8