多线程
一、什么是进程
进程是系统进行资源分配和调用的独立单元,每一个进程都有它的独立内存空间和系统资源。
Cpu执行的最小单位是什么? 时间片. 执行哪一个 线程.
单核的电脑上面, 我现在一个进程里面有若干个线程,去执行一定任务的时候,总时间会不会变少?
二、单进程操作系统和多进程操作系统的区别
a) 多进程操作系统是指在同一个时段内可以执行多个任务(时间片)
b) 边听音乐边敲代码,CPU切换非常快
c) Windows操作系统-多进程操作系统
d) Dos操作系统-单进程的操作系统
e) Linux操作系统-多用户多进程的操作系统
思考:现在的多核CPU是否可以让系统在同一个时刻可以执行多个任务吗?
三、什么是线程,理解线程和进程的关系
线程是进程里面的一条执行路径,每个线程同享进程里面的内存空间和系统资源
我们应用的软件有哪些是多线程的应用?
四、编写多线程的应用程序?
a) 创建一个自己的线程类,继承Thread,重写run方法
b) 创建一个自己的任务类,实现Runnable接口,重写run方法
c) 如何正确启动一个新的线程?
d) 另外两种实现多线程的方式有何区别?
经典面试题:请问当我们编写一个单纯的main方法时,此时该程序是否为多线程的?为什么?
五、线程的优先级
注意: 优先级是java自己设定的一个值,由大到小,优先级高. 但是! 操作系统不会管你优先不优先.
使用 setPriority(1-10) 来设置优先级.
执行时间较长的设置低的优先级,保证不会独占cpu.
六、让线程休眠 sleep
Thread.sleep(1000);
七、线程的礼让 yield
正确理解线程的礼让,暂停当前正在执行的线程对象,并执行其他线程。
练习:创建两个线程A,B,分别各打印100次,从1开始每次增加1,其中B一个线程,每打印一次,就yield一次,观察实验结果
Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。
yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
八、线程的合并 join
主线程和子线程同时运行,满足一定条件后,让子线程先运行至结束
练习:主线程和子线程各打印200次,从1开始每次增加1,当主线程打印到10之后,让子线程先打印完再打印主线程
Join: 如果是 my.join(); 则:阻塞调用此方法的线程,直到my线程完成后再执行.