首页 课程 师资 教程 报名

Javase视频学习-多线程总结

  • 2020-02-09 10:41:39
  • 1747次 动力节点


  一.线程间的通信


  定义


  多个线程并发执行时,默认情况下CPU是随机切换线程的


  如果我们希望他们有规律的执行,就可以使用通信


  线程之间也不是直接干预某个线程,也是随机的


  2.常用方法


  wait()让当前线程处于等待状态,并释放锁


  notify()唤醒某个等待中的线程


  notifyAll()唤醒所有等待中的线程


  3.演示(两个线程之间的通信)


      Javase视频学习-多线程总结


  4.演示(多个线程间的通信)


      Javase视频学习-多线程总结

      Javase视频学习-多线程总结


  5.注意事项


  线程间的所有通信行为都必须在同步代码块中执行


  这些行为都是锁调用的


  当一个线程陷入等待,线程会释放掉锁,并且无法动弹,即使被唤醒了,也仅仅表示有了获取锁的机会,只有当真正获取到锁的时候才能继续运行


  wait方法还有重载的方法,可以传入毫秒值,表示多少毫秒之后当前线程自动唤醒


  一个锁只能唤醒被自己锁定的线程


  无法在当前同步代码块内操作别的锁


  6.测试题


  需求:小明同学上了大学,父亲每次给1000块,小明每次花100元,当钱花完了,就打电话给父亲,通知他去银行存钱,编程模拟


  思考,为什么wait和notify方法定义在Object中?


  二.ThreadLocal


  定义


  ThreadLocal是线程的本地变量,是一个存储变量的容器,存入到这个容器中的变量的变量可以在线程的任何位置取出.


  ThreadLocal中的变量是使用线程分离的,别的线程无法使用,保证了变量的安全性


  2.演示


      Javase视频学习-多线程总结


  三.互斥锁


  定义


  使用ReentrantLock类代替synchronized关键字,提供了锁定和解锁的方法


  提供了更多的操作所得方法


  2.常用方法


  lock()锁定当前线程


  unlock()解锁


  newCondition()获取可以操作线程等待和唤醒的Condition对象


  await()让当前线程陷入等待


  signal()唤醒某个被锁定的线程


  3.演示


      Javase视频学习-多线程总结


  4.注意事项


  互斥锁提供了更多的操作线程的方法供我们使用


  Condition对象允许我们在任意锁内唤醒任意线程


  前提是使用统一把锁(同一个ReentrantLock对象)


  四.线程的七种状态


     Javase视频学习-多线程总结


  2.状态解析


  初始状态:线程对象创建完成


  就绪状态:线程可以被执行


  运行状态:线程正在运行中


  阻塞状态:线程被休眠


  等待队列:线程陷入无限的等待中


  锁池状态:线程被唤醒,但没有获取到锁


  死亡状态:线程执行完毕,被关闭


  3.注意事项


  大部分书籍里都讲线程的状态分为5类,既初始,就绪,运行,阻塞,死亡


  但我更愿意将阻塞状态细分出来,因为阻塞,等待队列,锁池,完全是不同的性质


  五.线程组(了解)


  定义


  Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。


  提供了一些操作整体的方法,比如设置组中线程的权限,销毁所有所有线程等等


  2.演示


  publicclassTestDemo{


  publicstaticvoidmain(String[]args){


  Threadt1=newThread();


  Threadt2=newThread();


  //获取线程的组


  System.out.println(t1.getThreadGroup().getName());


  System.out.println(t2.getThreadGroup().getName());


  //创建新的线程组


  ThreadGroupgroup=newThreadGroup("新的线程组");


  //创建线程的时候确定组给线程起个新名字


  Threadt3=newThread(group,"张三");


  Threadt4=newThread(group,"李四");


  System.out.println(t3.getThreadGroup().getName());


  System.out.println(t4.getThreadGroup().getName());


  }


  }


  六.线程池(了解)


  定义


  程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用


  在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池


  2.演示


  publicstaticvoidmain(String[]args){


  Runnablerunnable=newRunnable(){


  publicvoidrun(){


  System.out.println(Thread.currentThread().getName()+"线程执行了");


  }


  };


  //创建线程池


  ExecutorServicees=Executors.newCachedThreadPool();


  //调用线程池中的线程执行逻辑代码


  es.submit(runnable);


  es.submit(runnable);


  es.shutdown();


  }


  七.Runtime类


  定义


  这是一个单例类,可以运行系统命令


  2.演示


  publicstaticvoidmain(String[]args)throwsIOException{


  Runtimeruntime=Runtime.getRuntime();


  runtime.exec("shutdown-s-t300");//300秒后关机


  runtime.exec("shutdown-a");//取消关机


  }


  八.Timer类


  定义


  定时器,可以在指定时间执行任务,可以重复执行


  其实就是在指定时间去调用某个方法


  任务类必须继承TimerTask类,并且重写run()方法


  2.常用方法


  schedule(TimerTasktask,Datetime)安排在执行时间执行任务


  schedule(TimerTasktask,Datetime,longperiod)安排在指定时间开始执行任务,并按固定时间长度重复执行


  schedule(TimerTasktask,longdelay)从当前时间延迟一段时间执行任务


  schedule(TimeTasktask,longdelay,longperiod)从当前时间延迟一段时间执行任务,并按固定时间长度重复执行


  3.演示


  publicstaticvoidmain(String[]args)throwsIOException{


  TimerTasktask=newTimerTask(){


  @Override


  publicvoidrun(){


  System.out.println("赶紧起床了........");


  }


  };


  Timertimer=newTimer();


  timer.schedule(task,5000);


  }


  作业


  第一题


  需求:创建3个线程,让着三个线程按顺序执行(比如:线程一,线程二,线程三.......)


  2.第二题


  子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,试写出代码


  1.扩展题


  需求:有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:


  A:123412....


  B:234123....


  C:341234....


  D:412341....


  2.扩展题


  启动3个线程打印递增的数字,线程1先打印1,2,3,4,5,然后是线程2打印6,7,8,9,10,然后是线程3打印11,12,13,14,15.接着再由线程1打印16,17,18,19,20....以此类推,直到打印到75.


  3.扩展题


  查阅资料,制作一个闹铃程序,到设定的时间就播放音乐


  动力节点Javase相关视频免费下载学习


  Javase视频教程【301集】:http://www.bjpowernode.com/v104/


  Java视频下载【JavaSE进阶】:http://www.bjpowernode.com/v61/


Javase视频学习-多线程总结


       以上就是动力节点Java培训机构小编介绍的“Javase视频学习-多线程总结”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。


  相关内容


  java多线程的状态转换以及基本操作


  常见Java多线程面试题总结


  Java多线程学习,深入解析


选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交