这篇文章主要介绍“java多线程的原理及用法”,在日常操作中,相信很多人在java多线程的原理及用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答“java多线程的原理及用法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
<编辑类="目录">目录编辑>- <李>
一、线程的生命周期
李>- <李>
JDK中用线程。状态类定义了线程的几种状态:
李>二、线程同步
李>- <李>
1,为什么要有线程同步
李> <李>2,同步
李>- <李>
2.1同步代码块
李> <李>2.2同步方法
李>3,锁锁
李>一、线程的生命周期
JDK中用线程。状态类定义了线程的几种状态:
要想实现多线程,必须在主线程中创建新的线程对象. java语言使用线程类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的五种状态:
- <李>
新建:当一个线程类或其子类的对象被声明并创建时,新生的线程对象处于新建状态;
李> <李>就绪:处于新建状态的线程被开始()后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件,只是没分配到CPU资源;
李> <李>运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,运行()方法定义了线程的操作和功能,
李> <李>阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU并临时中止自己的执行,进入阻塞状态;
李> <李>死亡:线程完成了它的全部工作或线程被提前强制性地中止或出现异常导致结束。在上面五个阶段中,只有新建和死亡是不可重复,其它几个状态都可能改变。
李>
<强>注意:强>
1。新建和死亡状态只能有一次;
2。运行状态只能是从就绪状态变过来的;
3。阻塞状态不能直接变为运行状态,需要通过就绪状态;
4。当一个运行状态的线程调用收益率()方法后,就会变为就绪状态;
5。当一个运行状态的线程调用睡眠(),等待同步锁方法,等()方法或加入()方法时,就会处理阻塞状态;
6。当一个阻塞状态的线程调用通知()/notifyAll()方法,或睡眠者()方法结束,再或者获得同步锁,或者加入()线程执行完毕就可以变为就绪状态的线程
7。当一个线程执行过多后就处理死亡状态,即线程生命周期结束。
二线程同步
1,为什么要有线程同步
为了解决线程安全问题,在多线程下,多个线程对一个数据进行修改时,可能会产生数据出错的问题,所以我们就需要通过线程同步的方法来解决问题。
java中的线程同步实现方式:
2,
2.1同步同步代码块
示例:
public class MyRunnableTest { ,,,public static void main (String [], args), { ,,,,,,,MyRunnable MyRunnable =, new MyRunnable (); ,,,,,,,Thread Thread =, new 线程(myRunnable,“A"); ,,,,,,,Thread thread1 =, new 线程(myRunnable,“B"); ,,,,,,,Thread thread2 =, new 线程(myRunnable,“C"); ,,,,,,,Thread thread3 =, new 线程(myRunnable,“D"); ,,,,,,,Thread thread4 =, new 线程(myRunnable,“E"); ,,,,,,,thread.start (); ,,,,,,,thread1.start (); ,,,,,,,thread2.start (); ,,,,,,,thread3.start (); ,,,,,,,thread4.start (); ,,,} ,,,public class MyRunnable implements Runnable { ,,,,,,@Override ,,,,,,,public void 运行(),{ ,,,,,,,,,,,synchronized (Thread.class) { ,,,,,,,,,,,,,,,System.out.println (Thread.currentThread () . getname() +“在过山洞“); ,,,,,,,,,,,,,,,try { ,,,,,,,,,,,,,,,,,,,thread . sleep (300); ,,,,,,,,,,,,,,,},catch (InterruptedException e), { ,,,,,,,,,,,,,,,,,,,e.printStackTrace (); ,,,,,,,,,,,,,,,} ,,,,,,,,,,,} ,,,,,,,}
注意:同步锁可以是任意对象,但该对象必须唯一;同步代码块所在位置也很重要,同步代码块需要把引起数据问题的所有代码都包裹起,不能多裹,也不能少裹。我们通常都是使用字节码文件来作为同步锁。