Java基础之线程篇

一:线程的生命周期

  线程的生命周期包括 新建--就绪--运行--阻塞--死亡,它们之间相互切换的方式如下:

 

二:创建多线程的方式(4种方式)

  方式一:继承Thread类

  

  方式二:实现Runnable接口

   

  方式三:实现Callable接口 -----JDK 5.0 新增

 

   方式四:使用线程池的方式

  流程:(NumberThread 是实现Runnable 或 Callable 接口的实现类)

 

三:线程的同步 (解决安全问题)

  什么是线程的安全问题?

  • 多个线程执行的不确定性引起执行结果的不稳定
  • 多个线程对同一块内存空间的共享,会造成操作的不完整性,破坏数据。(如多个线程同时对一个数据进行操作)

  例子:创建三个窗口卖票,一共100张票。

  1.问题:卖票过程中,出现了重票,错票------>出现了线程安全问题(有共享数据,才可能会有线程安全问题)。

  2.问题出现的原因:当某个线程操作车票的过程中,尚未完成操作,其他进程这时也参与进来操作车票。

  3.如何解决:当一个线程在操作车票的过程中,其他进程不能参与进来,直到当前进程操作完为止。

  4.在java中,通过同步机制来解决线程安全问题。有3种方式:

  第一种:

  第二种:

  

 

  如果某个线程正在运行同步代码块中的代码时(也就是synchronized中的代码),其他线程是不能访问这段代码的,相当于加上了一把锁,只有当这段代码块执行完毕,其他线程才有机会进入该段代码。

  第三种:Lock锁 -----JDK 5.0 新增

  同步过程如下:

  (1)ReentrantLock lock = new ReentrantLock();   //实例化ReentrantLock

  (2)lock.lock();   //调用lock方法进行锁定,这之后的代码就相当于加上了锁,只有当前线程能访问。

  (3)lock.unlock();    //调用unlock方法进行解锁。

   注意:同步的方式,虽然解决了线程的安全问题,但操作同步代码块时,只能有一个线程参与,其他线程等待。相当于是一个单线程的过程,效率低(但线程的安全问题只能这么解决)。

 

四:线程的死锁问题

五:线程的通信(涉及的三个方法:wait(),notify(),notifyAll())

 

 

 

本文参考自尚硅谷Java教程视频:https://www.bilibili.com/video/BV1Kb411W75N?p=446&spm_id_from=pageDriver

posted @ 2021-03-08 19:28  Only、  阅读(84)  评论(1)    收藏  举报