多线程

电脑中真正执行的是线程!但我们看到的都是进程!

进程:是由一个或N个线程组成的!

线程:CPU调度和分配的基本单位!

多线程:在同一个进程中,同时(感觉)运行多个线程,来完成不同的工作!

多线程的优点:01.充分利用CPU的资源

          02.提升用户的体验

代码实现多线程的方式:

1.继承Thread类

2.实现Runnable接口

3.实现Callable接口

run()和start()的区别:

  start()

    01.是启动线程,是Thread类中的方法

    02.不代表立即执行线程

    03.底层会调用run()

  run()

    01.CPU分配时间片给线程是,线程真正执行

    02.就是一个普通方法

    03.run()写的内容 称之为 线程体

线程的生命周期:

  01.新生状态  new

  02.就绪状态  start();

  03.运行状态  run();

  04.阻塞状态

    sleep();wait();yield();(礼让的线程处于就绪状态)join();

  05.死亡状态

    001.正常死亡 run()执行完毕

    002.异常死亡 run()执行过程中出现异常,终止运行

线程的调度:

  按照我们制定的方式,给多个线程设置CPU的使用权

1.线程的优先级setPriority

  优先级越高 代表获取CPU的概率越高 并不代表一定执行

2.join()

  让新的线程加入进来,新线程执行完毕之后,其他线程才能执行!

3.sleep(long ms)  Thread类中方法

    01.线程休眠,占着CPU资源不放!其他线程都无法获取CPU资源!必须等待!

    02.long ms指的是在多长时间之后,进入就绪状态!

  wait()是Object类中的方法!

  线程wait()的时候,会释放占用的CPU资源!

    01.其他的线程无需等待!

    02.必须使用notify唤醒才能进入就绪状态!

4.yield()

  线程的礼让,概率问题,可能礼让不成功。

5.线程的终止

  01.Interrupt:只是设置线程的中断状态,不是终止线程!线程还会继续执行!

  02.isInterrupted:来判断线程是否是中断状态

  03.Interrupted:清楚中断状态

  04.执行了wait或sleep,会默认清除中断状态

并发:synchronized

  同步代码块和同步代码块方法 synchronized 给线程上锁

  同步(synchronous阻塞):一个线程在执行操作时,其他线程必须等待!

  异步(asynchronous非阻塞):一个线程在执行操作时,其他线程无须等待!

注意点:

  1.同一个时间只有一个线程能进入synchronized修饰的代码块或方法

  2.当一个线程访问synchronized代码块或者方法的时候,其他的线程等待,其他synchronized代码块也会被锁定!

  3.当一个线程访问synchronized代码块或者方法的时候,其他的线程可以访问非synchronized修饰的代码块或方法!

Runnable和Callable的区别

  01.Runnable接口中只有一个run()没有返回值 没有声明异常

   Callable接口中只有一个call()有返回值 有声明异常

  02.Callable中的call()返回值我们一般使用Future接口来接收

  03.涉及了Future思想

线程的分类

  用户线程:User Thread 默认我们创建的线程就是!

  守护线程:Daemon Thread 为其他线程提供服务的!GC线程,需要我们设置

  注意事项:

    01.默认我们创建的线程就是用户线程!

    通过Thread类中的setDaemon(ture)可以转换成守护线程

    02.只要有用户线程存在,程序就不会终止,所有用户线程都执行完毕后,程序会结束所有守护线程!LVM停止工作!

    03.setDaemon(true)必须在start()之前

    04.守护线程永远不会访问资源!

原文地址:https://www.cnblogs.com/dongfengpo/p/8167003.html