线程相关概念

1. 并发与并行

  1. - 并发(指两个或多个事件在同一个时间段内发生)
  2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581175510398-07dcaa02-53f5-46fe-935b-000d47da2b45.png#align=left&display=inline&height=541&margin=%5Bobject%20Object%5D&name=image.png&originHeight=541&originWidth=571&size=118313&status=done&style=none&width=571)
  3. - 并行(多个事件同时执行)
  4. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581175558530-7e1f8cb4-6ab9-4b90-86ab-4728b967b1fc.png#align=left&display=inline&height=510&margin=%5Bobject%20Object%5D&name=image.png&originHeight=510&originWidth=579&size=113785&status=done&style=none&width=579)

2. 线程与进程

  1. - 进程(进入到内存运行的程序)
  2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581175818710-89a0aeb3-7c77-460f-9a2e-4864ef78dc2b.png#align=left&display=inline&height=359&margin=%5Bobject%20Object%5D&name=image.png&originHeight=359&originWidth=544&size=159490&status=done&style=none&width=544)
  3. - 线程(cpu对程序执行的分片)
  4. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581176463195-1a018941-761e-4eff-abd8-bde84872acaf.png#align=left&display=inline&height=175&margin=%5Bobject%20Object%5D&name=image.png&originHeight=175&originWidth=512&size=96814&status=done&style=none&width=512)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581176483207-a23e3a70-65fa-4408-a02d-831becebb853.png#align=left&display=inline&height=635&margin=%5Bobject%20Object%5D&name=image.png&originHeight=635&originWidth=661&size=357723&status=done&style=none&width=661)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581176496629-4c4547f4-f4b9-414f-899d-92fe5d7bb9a7.png#align=left&display=inline&height=422&margin=%5Bobject%20Object%5D&name=image.png&originHeight=422&originWidth=375&size=167750&status=done&style=none&width=375)
  5. - 线程的调度
  6. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581176802695-b63c6325-51fb-48c5-aee7-97b7213cc694.png#align=left&display=inline&height=271&margin=%5Bobject%20Object%5D&name=image.png&originHeight=271&originWidth=1123&size=219669&status=done&style=none&width=1123)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581177117911-7cd6ad97-534d-4455-a00d-15b4ddce7f8f.png#align=left&display=inline&height=147&margin=%5Bobject%20Object%5D&name=image.png&originHeight=147&originWidth=492&size=118120&status=done&style=none&width=492)

3. 创建线程类

  1. - 创建thread类的子类对象(重写run),调用thread类中的start方法(示例)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581244908231-c0920630-18b6-40a8-b68d-2484efe212f1.png#align=left&display=inline&height=494&margin=%5Bobject%20Object%5D&name=image.png&originHeight=494&originWidth=411&size=20864&status=done&style=none&width=411)
  2. - 注意:如果调用run()方法而不是start()方法那么这只是一个单线程,只有调用了start方法才会多线程<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581245618536-4e1ff2be-bf20-4d27-a84e-73c829117cb9.png#align=left&display=inline&height=479&margin=%5Bobject%20Object%5D&name=image.png&originHeight=479&originWidth=601&size=222016&status=done&style=none&width=601)

线程方法

1. 线程名字方法

  1. - getName():获取线程名称<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581245999314-a4751435-b811-4a0d-a58c-219441caefaf.png#align=left&display=inline&height=430&margin=%5Bobject%20Object%5D&name=image.png&originHeight=430&originWidth=419&size=18748&status=done&style=none&width=419)![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581246014967-b26abffd-4dd1-4ad3-aaad-315377cfe465.png#align=left&display=inline&height=95&margin=%5Bobject%20Object%5D&name=image.png&originHeight=95&originWidth=92&size=1288&status=done&style=none&width=92)<br />另外两种方法(也可以这样获取主线程的名称)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581246153859-0c295e95-1e55-43cd-90ae-5d82797bc2a5.png#align=left&display=inline&height=148&margin=%5Bobject%20Object%5D&name=image.png&originHeight=148&originWidth=340&size=6457&status=done&style=none&width=340)
  2. - setName()给线程起名字<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581252798447-0699ef1b-6459-4384-a045-fddfc8a4d099.png#align=left&display=inline&height=558&margin=%5Bobject%20Object%5D&name=image.png&originHeight=558&originWidth=562&size=27514&status=done&style=none&width=562)

2. 线程让步睡眠合并

  • sleep()线程睡眠函数(本身带有异常处理,这里选择try catch)
    image.png
  • yield()线程让步函数(静态方法,暂停当前线程,但是仍为活跃等待的状态) ```java //线程让步 //Thread的一个静态方法,暂停现在的线程

public class Test1 {
public static void main(String[] args) throws InterruptedException {
new MyThread(“低级”, 1).start();
new MyThread(“中级”, 5).start();
new MyThread(“高级”, 10).start();
}
}

class MyThread extends Thread {
public MyThread(String name, int pro) {
super(name);// 设置线程的名称
this.setPriority(pro);// 设置优先级
}

  1. @Override
  2. public void run() {
  3. for (int i = 0; i < 30; i++) {
  4. System.out.println(this.getName() + "线程第" + i + "次执行!");
  5. if (i % 5 == 0)
  6. Thread.yield();
  7. }
  8. }

}

```

  • join()线程合并函数(就是把一个线程加到另一个函数的后边,必须按顺序执行,多个线程合成一个)

    • void join()
      1. - 当前线程等该加入该线程后面,等待该线程终止。
    • void join(long millis)
      1. - 当前线程等待该线程终止的时间最长为 millis 毫秒。 如果在millis时间内,该线程没有执行完,那么当前线程进入就绪状态,重新等待cpu调度
    • void join(long millis,int nanos)
      1. - 等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。如果在millis时间内,该线程没有执行完,那么当前线程进入就绪状态,重新等待cpu调度

      3.线程优先级

  • setPriority(int num) 设置线程的优先级,1-10 即可

    • image.pngimage.png建议优先级
    • 像这样就行,建议使用后边的优先级常量