线程与进程
进程
是指一个内存中运行的应用程序,每一个进程都有一个独立的内存空间
线程
- 是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程至少有一个线程
- 线程是进程的进一步划分,进程启动后的若干执行路径又可划分为若干个线程
线程调度
分时调度
所有线程轮流使用CPU的使用权,平均给配每个线程占用CPU的时间
抢占式调度(Java)
- 优先让优先级高的线程使用(CPU),相同时随机
- CPU在多个线程中高速切换,对于CPU一个核一个时刻只能执行一个线程,一位内切换速度和处理时间相对人的感觉而言相对要快,看上去是同时执行的。
- 对于单核CPU多线程并不能提高程序的运行速度,但能够提高程序的运行效率(IO与运算),让CPU使用率更高。
同步与异步
- 同步:排队执行,效率低但安全
- 异步:同时执行,效率高但是数据不安全
并发与并行
- 并发:两个或多个事件在同一个时间段同时发生
- 并行:在同一时刻同时执行
继承Thread
run():线程要执行的任务方法
- 一条新的执行路径
- run()不是通过调用触发,而是通过,Thread 的start()方法启动
方法
- Thread()
- Thread(String name)
- Thread(Target Ruannable,String name)
- 停止通知:
编程的时候进行设置 stop 停止标识变量,当stop为true时,线程停止 - sleep(long millis,int nanos):休眠,程序停止一段时间
- setDaemon(boolean on):将程序标记为用户线程的守护线程
实例
定义一个 Thread 子类
public class Demo extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("疑是地上霜"+i);
}
}}
- 在main函数中调用
public class MyTest {
public static void main(String[] args) {
Demo myThread = new Demo();
myThread.start();
for (int i = 0; i < 10; i++) {
System.out.println("窗前明月光"+i);
}
}}
- 执行结果
窗前明月光0
疑是地上霜0
窗前明月光1
疑是地上霜1
窗前明月光2
疑是地上霜2
窗前明月光3
疑是地上霜3
窗前明月光4
疑是地上霜4
窗前明月光5
疑是地上霜5
窗前明月光6
窗前明月光7
疑是地上霜6
窗前明月光8
疑是地上霜7
窗前明月光9
疑是地上霜8
疑是地上霜9
Process finished with exit code 0
-
两个线程执行情况:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eh3kncbl-1626424428583)(en-resource://database/1129:1)] -
每个线程都有自己的一个栈空间(调用方法),但共用一个堆内存(储存数据)
-
匿名内部类继承Thread 可以直接实现线程
new Thread(){
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("疑是地上霜"+i);