多线程基础

廉价感情. 提交于 2020-03-06 00:15:12

一、线程和进程的区别:

进程是系统分配资源的最小单位,线程是系统调度的最小单位。
每个进程至少有一个线程存在,即主线程。

进程是有自己的独立地址空间的,有进程控制块(PCB)来控制进程的状态变换,也有专门的算法来控制进程的调度(先进先出,高优先比优先,短作业优先,时间片轮转等),线程是共享进程的资源的,JVM会为每一个线程划分特殊的空间:
在这里插入图片描述

二、并发和并行

并发: 多个进程在一个CPU下采用时间片轮转的方式,在一段时间之内,让多个进程都得以推进,称之为并发。(也就是同一时间只有一个进程在执行)
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行

三、线程创建的方法

1.通过继承Thread类
在这里插入图片描述2.实现Runnable接口
在这里插入图片描述在这里插入图片描述
3.其他变形
在这里插入图片描述

四、线程常见属性

在这里插入图片描述

  • ID 是线程的唯一标识,不同线程不会重复
  • 名称是各种调试工具用到
  • 状态表示线程当前所处的一个情况,下面我们会进一步说明
  • 优先级高的线程理论上来说更容易被调度到
  • 关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行。
  • 是否存活,即简单的理解,为 run 方法是否运行结束了
  • 线程的中断问题,下面我们进一步说明

五、start()和run()方法

复写run()方法是提供给线程要做的事情的指令清单,而start()方法则是线程真正独立的去执行了
在这里插入图片描述在这里插入图片描述在这里插入图片描述

六、中断一个线程

1.调用.thread()方法进行中断
2.通过共享标记来通知
都是通过改变线程中标志位来让线程中断,当线程已经调用wait/join/sleep方法而阻塞挂起,那么interrupt方法就会抛出InterruptedException 异常,清除中断标志
Thread.interrupted() 判断当前线程的中断标志被设置,清除中断标志
Thread.currentThread().isInterrupted() 判断指定线程的中断标志被设置,不清除中断标志

七、等待一个线程

作用: 等待一个线程完成后,才进行下一个线程;
用法: 调用.join()方法 (无参就是等待上一个线程完成,有参就是等待参数时间后执行下一个线程,如果当前参数时间超过上个线程执行时间,那么以线程时间执行完毕为准)



public class Test{
    public static void main(String[] args) throws InterruptedException {
      Thread t1 =new Thread(new Runnable() {
          @Override
          public void run() {
              System.out.println("t1开始执行睡眠");
              try {
                  Thread.sleep(3000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
      });
        Thread t2 =new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("t2开始执行睡眠");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();
       t1.join();   //t2等待t1完成后执行
        t2.start();
       t2.join(); //主线程等待t2完成后执行
        System.out.println("主线程结束");
    }
}

在这里插入图片描述

八、获得当前线程引用

调用Thread.currentThread()方法即可
	例Thread t1 = Thread.currentThread();

九、休眠当前线程

在这里插入图片描述

十、线程的状态转换

for(Thread.State state : Thread.State.values()){
          System.out.println(state);
      }

在这里插入图片描述状态转换图:
在这里插入图片描述

十一、yeild方法

Yeild()方法就是让出cpu让别的线程去执行,自己会回到就绪态等待执行。

public class Test{
    public static void main(String[] args) throws InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    System.out.println("t1正在执行");
                    Thread.yield();
                    
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0;i<10;i++){
                    System.out.println(i);
                }
            }
        }).start();
    }
}
结果:先输出0-9然后一直输出t1正在执行

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!