当前位置: 首页 > news >正文

深圳住房与建设部网站鲜花加盟网站建设

深圳住房与建设部网站,鲜花加盟网站建设,网站开发工程师需要具备的综合素质,如何制作新型网站程序多线程#xff08;二#xff09; 文章目录 多线程#xff08;二#xff09;第一个多线程程序观察线程sleep创建线程继承Thread类#xff0c;重写run方法实现Runnable#xff0c; 重写run继承Thread#xff0c;重写run实现Runnable#xff0c;重写run基于lambda表达式 T…多线程二 文章目录 多线程二第一个多线程程序观察线程sleep创建线程继承Thread类重写run方法实现Runnable 重写run继承Thread重写run实现Runnable重写run基于lambda表达式 Thread的常见构造方法Thread几个常见属性setDaemon();isAlive(); 续上文 多线程一我们可以了解到多线程和普通程序的区别 每一个程序都是一个独立的执行流多个线程之间都是“并发”执行的 第一个多线程程序 class MyTread extends Thread{Overridepublic void run() {//这个方法就是线程的入口方法while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(hello thread);}} }//演示创建线程 public class Demo1 {public static void main(String[] args) throws InterruptedException {Thread t new MyTread();//start 和 run 都是 Thread 的成员//run 只是描述了线程的入口线程主要做什么任务//start 则是真正调用了系统API,在系统中创建线程让线程再调用run//t.start();//t.run();t.start();while (true){System.out.println(hello main);Thread.sleep(1000);}} }通过运行这个程序我们可以发现两个while循环在“同时执行”可以看到打印结果是两边的日志在交替打印的: 这也说明了 每个线程都是一个独立执行的逻辑也就是独立的执行流~ 我们也可以形象的看作是兵分两路并发执行~ 而 并发 并行 并发 并发编程的效果 充分使用多核cpu资源 不过当我们将main 函数的t.start();改成t.run(); public static void main(String[] args) throws InterruptedException {Thread t new MyTread();//start 和 run 都是 Thread 的成员//run 只是描述了线程的入口线程主要做什么任务//start 则是真正调用了系统API,在系统中创建线程让线程再调用runt.run();while (true){System.out.println(hello main);Thread.sleep(1000);}}此时代码中不会创建新的线程就只有一个主线程这个主线程只能依次执行循环执行完一个在执行另外一个~不过因为代码中是while(true)是不会循环结束的所以代码也就无法走到hello main了。 还有一个需要我们了解的main这个线程是jvm自动创建的和其他线程比起来并没有什么特殊的在一个java进程中至少都会有一个main线程。 观察线程 当我们多线程程序运行的时候我们可以使用IDEA或者jconsole来观察该进程内的多线程情况~ 这里我们主要介绍jconsolejconsole是jdk自带的程序 而jconsole我们可以在jdk包里找到 首先我们要先找到jdk的安装地址 在地址处找到jdk然后打开bin目录然后再列表中找到jconsole.exe 这里我们要注意的是 在启动jconsole.exe之前我们得确保IDEA的程序已经跑起来了 sleep 上述的线程我觉得他在while循环中转的太快了想要他慢点~ 那我们就可以使用Thread.sleep();,sleep是Thread的静态方法 需要注意的是我们使用sleep的时候汇报这样的错误 MyRunnable里的异常是受查异常必须要显示处理此处必须try catch不能用throws在这个代码中是重写父类的run父类的run没有throws,子类方法也就不能也有。 而这个程序每秒所打印出来的内容顺序都是不确定的。 因为这两线程都是休眠1000ms当时间到后谁先谁后是不一定的这个过程可以视为“随机” 操作系统对于多个线程的调度顺序是不确定随机的而此处的随机不是数学上的概率均等的随机是取决于 操作系统 对于线程调度的模块调度器来具体实现的~ 创建线程 继承Thread类重写run方法 package Thread.test_8_12; class MyTread extends Thread{Overridepublic void run() {//这个方法就是线程的入口方法while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(hello thread);}} }//演示创建线程 public class Demo1 {public static void main(String[] args) throws InterruptedException {Thread t new MyTread();//start 和 run 都是 Thread 的成员//run 只是描述了线程的入口线程主要做什么任务//start 则是真正调用了系统API,在系统中创建线程让线程再调用run//t.start();//t.run();t.start();while (true){System.out.println(hello main);Thread.sleep(1000);}} } 实现Runnable 重写run package Thread.test_8_12; class MyRunnable implements Runnable{Overridepublic void run() {while (true) {System.out.println(hello world);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}} }public class Demo2 {public static void main(String[] args) throws InterruptedException {Runnable runnable new MyRunnable();Thread t new Thread(runnable);t.start();while (true){System.out.println(hello main);Thread.sleep(1000);}} } 好处 使用Runnable的写法和直接继承Thread之间的区别就是解耦合 使用Runnable接口重写run方法相对于直接继承Thread类的方式更加灵活、可扩展并且能够实现解耦合。我们可以将任务逻辑与线程的实现分离通过实现Runnable接口我们能够更好地控制线程的行为并在需要时更好地管理和复用线程。 这里我们举个例子 你老婆想要喝水但是她又懒得去接水于是她就会叫你或者你5岁孩子去接水。 而接水就是一个任务你执行还是你孩子执行这是没有本质区别的那么此时我们就可以将接水这个任务单独提取为Runnable后续是谁都可以轻轻松松完成这个任务~ 但是如果任务变了呢接水 - 泡茶 那么此时这个任务就只能你来完成了你那5岁孩子完成不来任务 那么这个任务就是和你这个线程有一定耦合关系的~ 而我们创建一个线程需要进行两个关键操作 明确线程要执行的任务 任务本身不一定和线程 概念 强相关的 这个任务只是单纯的执行一段代码这个任务是使用单个线程执行还是多个线程执行亦或是别的方式信号处理函数/协程/线程池都没什么区别~任务本身就可以将任务本身提取出来此时就可随时把代码改成使用其他方式来执行这个任务~ 调用系统的 api 创建线程 继承Thread重写run package Thread.test_8_12; public class Demo3 {public static void main(String[] args) {//匿名内部类Thread t new Thread(){Overridepublic void run() {while (true){System.out.println(hello world);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}};t.start();while (true){System.out.println(hello main);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}} } ** ** 实现Runnable重写run package Thread.test_8_12; public class Demo4 {public static void main(String[] args) {Runnable runnable new Runnable() {Overridepublic void run() {while (true) {System.out.println(hello world);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}};Thread t new Thread(runnable);t.start();while (true){System.out.println(hello main);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}} } 基于lambda表达式 package Thread.test_8_12; public class Demo6 {public static void main(String[] args) {Thread t new Thread(()-{while (true){System.out.println(hello world);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();while (true){System.out.println(hello main);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}} } 那为什么lambda表达式不用重写run方法 实际上啊lambda自身就是run方法 lambda:本身就是用来表示逻辑的使用lambda就能描述出当前的线程要干嘛run方法线程的入口通俗来说就是告诉线程你要干啥子~ Thread的常见构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用Runnable对象创建线程对象Thread(String name)创建线程对象并命名Thread(Runnable target, String name)使用Runnable对象创建线程对象并命名Thread(TreadGroup group, Runnable target)线程可以被用来分组管理分好的几位线程组 public class Demo7 {public static void main(String[] args) {Thread t new Thread(() - {while (true) {System.out.println(hello thread);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}, 这是一个新线程);t.start();}Thread几个常见属性 属性获取方法IDgetId()名称getName()状态getState()优先级getPriority()是否后台进程isDaemon()是否存活isAlive()是否被中断isInterrupted() setDaemon(); 一般默认下一个进程是前台线程~ public static void main(String[] args) {Thread t new Thread(() - {while (true) {System.out.println(hello thread);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}, 这是一个新线程);//设置 t 为后台线程t.setDaemon(true);t.start();}调用setDaemon(true)方法将t设置为后台线程。后台线程是一种特殊的线程当所有前台线程例如主线程都结束时后台线程会自动终止 改成后台线程之后主线程飞快执行完了此时就没有其他前台线程了于是线程结束t线程来不及执行就 over 了~~ isAlive(); Thread 对象的生命周期要比系统内核中的线程更长一些~ Thread对象还在内核中的线程已经销毁了这样的情况(不求同年同月同日生也不求i同年同月同日死) 所以我们可以使用isAlive来判定内核线程是不是已经没了也就是回调函数执行完毕线程就没了 package Thread; public class Demo8 {public static void main(String[] args) {Thread t new Thread(()-{System.out.println(线程开始);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(线程结束);});t.start();System.out.println(t.isAlive());try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(t.isAlive());} } 下面用一张图概括一下本篇文章所讲的内容~ 至此多线程二先写到这后续会持续更新敬请期待~
http://www.hkea.cn/news/14256758/

相关文章:

  • 电影网站加盟可以做么商贸有限公司怎么样注册
  • 海口网站制作案例手机网站设计公司皆选亿企邦
  • mvc5网站开发项目下载店面设计图片
  • 免费域名申请网站大全推荐中国装修公司排行榜
  • 宁夏银川网站建设最常见的企业建站程序有
  • wordpress 上传资源seow
  • 怎样做微信网站南阳网站
  • 网站开发简历 自我评价可以免费下源码的网站
  • 网站建设对客户的影响答题app制作教程
  • 网站是asp还是php由一个网页建成的网站
  • 网站建设运营公司推荐可以看网站的手机浏览器
  • ui设计师怎么做自己的网站罗岗网站建设哪家好
  • 免费网站软件哪个好网站搭建要求模板
  • 设计网站手机app客户端wordpress js压缩
  • 做文案的网站软件开发项目总结
  • 百度竞价培训班昆明优化网站排名
  • 做网站商城前景怎么样如何跟客户销售做网站
  • wordpress 又拍云 缓存鹤壁网站优化
  • 网站推广与宣传怎么做印刷网站建设价格
  • 网站建设设计报价东莞厚街核酸检测点
  • 免费自助建站排名表单大师做网站
  • 网站顶部图片代码德州网站建设赖殿波
  • 网站建设进项填那个服务西宁做网站君博领衔
  • 优质的邵阳网站建设3d渲染网站建设
  • 别人抄袭网站设计怎么办肇庆网站建设
  • 巴中交通建设有限公司网站wordpress更改域名
  • 网站建设技术和销售工资广州品牌网络营销方式
  • 卓业网站建设网站建设虚线的代码
  • ADPR国际传媒网站建设上海阳性增多
  • 如何制作一个自己的网页网站做网站要学哪些