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

重庆网站建设公司 上海市杨浦区建设小学网站

重庆网站建设公司 ,上海市杨浦区建设小学网站,公众号文章排版编辑器,免费发布产品信息网站文章目录前言1.start()方法和run()方法2.不能两次调用start()方法3.线程的执行是随机的start()方法和run()方法的执行顺序不一定相同4.run()方法由JVM调用public Thread(Runnable target)中的target前言 本篇文章主要讲解以下几个问题: start()方法和run()方法的区别与联系为… 文章目录前言1.start()方法和run()方法2.不能两次调用start()方法3.线程的执行是随机的start()方法和run()方法的执行顺序不一定相同4.run()方法由JVM调用public Thread(Runnable target)中的target前言 本篇文章主要讲解以下几个问题: start()方法和run()方法的区别与联系为什么不能连续两次调用shart()方法run()方法中可能忽略的问题 1.start()方法和run()方法 我们在创建线程时,会重写run()方法.run()方法可以理解为线程要做的任务,但是直接调用run()方法,只是main线程也就是主线程去执行的,是没有新线程产生的 如果要想让线程去执行run()方法里面的代码,就需要让创建线程的对象去调用start()方法,shart()方法可以创建并启动线程,JVM调用run()方法后(后面会有介绍) 线程才会去执行 2.不能两次调用start()方法 同一个线程对象,只能调用一次start()方法,不能两次调用start()方法,调用两次的话,会抛出 IllegalThreadStateException 这个异常 示例如下: public class Example6 {public static void main(String[] args) {Thread t1 new Thread(()-{System.out.println(1);});t1.start();t1.start();} }为什么会这样?我们可以查看start()的源码 上面有一段话: A zero status value corresponds to state NEW 意思是 零状态值对应于状态“NEW” 线程运行时有六种状态,先熟悉一下,之后还会写文章进行详细介绍: 状态描述新建(NEW)表示线程已经创建好了,但是还没有调用start()方法就绪(RUNNABLE)表示线程可能在运行,也可能在就绪队列阻塞 (BLOCKED)表示线程处于等在锁的状态等待(WAITING)表示线程处于条件等待状态,当触发条件后会唤醒计时等待(TIME_WAIT)比WAITING多了个超时条件触发的机制终止(TERMINATED)表示线程执行结束 因此线程再调用start()方法之后,可能处于终止,或者其它非NEW状态,第二次调用的时候,相当于重新让线程运行一遍,从线程安全和线程本身的执行逻辑来看,都是不合理的,因此在调用start()方法之后,会对线程的状态进行一个判断,如果线程不是在NEW状态下,就会抛出异常 3.线程的执行是随机的 线程的执行是随机的,这也是个老生常谈的问腿了,究其原因还是因为线程的抢占式执行,谁先抢到 操作系统分配的CPU资源,谁先去执行 start()方法和run()方法的执行顺序不一定相同 示例1: 看一下代码及代码运行结果 class MyThread extends Thread{private int val;public MyThread(int val) {this.val val;}Overridepublic void run() {System.out.println(val);} } public class Example1 {public static void main(String[] args) {MyThread myThread1 new MyThread(1);MyThread myThread2 new MyThread(2);MyThread myThread3 new MyThread(3);MyThread myThread4 new MyThread(4);MyThread myThread5 new MyThread(5);myThread1.start();myThread2.start();myThread3.start();myThread4.start();myThread5.start();} }由此我们可以看到虽然是myThread1先调用的start()方法,但是输出的结果却是在第二位,而myThread3后执行却在第一位 再次运行一次代码的执行结果虽然与上次不同,但仍然是随机的,当然也不是没有运行结果是1 2 3 4 5的可能 示例2: 看一下代码及代码运行结果 public class Example4 {public static void main(String[] args) {Thread t1 new Thread(()-{while (true){System.out.println(t1);}});Thread t2 new Thread(()-{while (true){System.out.println(t2);}});t1.start();t2.start();} }这里我们也能看到,start()执行的顺序与run()方法执行的顺序无关,随机执行t1和t2的run()方法 虽然这里是while(true),但是线程之间是相互独立的,所以并不影响 因此可以得出结论:start()方法和run()方法的执行顺序不一定相同 4.run()方法由JVM调用 start()执行完后,创建的新线程不会立刻去执行run()方法, run()方法会先被JVM去调用,之后对应的线程才会去执行. public Thread(Runnable target)中的target 之前再讲创建线程的5种方法,介绍了实现Runnable接口,创建线程的方法 但其实这里面有一个坑,那就是public Thread(Runnable target)中的target参数,来看一下run()方法的底层源码 如果这里面的target不为空,才会去执行target的run()方法.如果传一个null,就不会去执行,如图所示: 代码如下: class MyRunnable implements Runnable{Overridepublic void run() {System.out.println(1);} } public class Example7 {public static void main(String[] args) {MyRunnable myRunnable1 new MyRunnable();MyRunnable myRunnable2 null;Thread t1 new Thread(myRunnable1);t1.start();Thread t2 new Thread(myRunnable2);t2.start();} }因此要注意使用继承Runnable接口 创建线程的时候 要注意target不要为null 文章到这里去结束了,感谢观看! “希望你继续兴致盎然的与世界交手,一直走在充满鲜花的道路”
http://www.w-s-a.com/news/629077/

相关文章:

  • 网站建站什么目录桂林网站建设内容
  • 光明新区城市建设局网站长沙营销型网站制作费用
  • 网站建设制度制定wordpress主题哥
  • 门户网站的种类php网站开发实训心得
  • 流程图制作网页网络优化seo
  • 个人公益网站怎么制作wordpress flat theme
  • 做营销型网站的公司篇高端网站愿建设
  • 五莲网站建设维护推广凡科做网站的方法
  • 山东省住房建设厅网站首页网站文章更新怎么通知搜索引擎
  • 商务网站的可行性分析包括大流量网站 优化
  • 推广网站有效的方法网站数据统计
  • 自建视频网站WordPress数据库添加管理员
  • 新民电商网站建设价格咨询网站建设高效解决之道
  • 做网站需要哪些步骤网站设计介绍
  • 物流网站制作目的国外中文网站排行榜单
  • 苏州网站建设招标网站ftp的所有权归谁
  • 未央免费做网站河间网站建设
  • 酒庄企业网站app制作多少钱一个
  • 西安模板建网站网站如何做直播轮播
  • 网站功能需求表百度怎么投放自己的广告
  • 如何免费制作网站网站icp备案费用
  • 网站建设最新教程wordpress表白墙
  • android电影网站开发网站建设与设计实习报告
  • 公司汇报网站建设方案烟台seo网站推广
  • 文章网站哪里建设好找素材的网站
  • 怎么做自己的彩票网站公司建设网站价格
  • 国外比较好的设计网站网站后台无法上传图片
  • 帮别人做网站的公司是外包吗用户登录
  • 关于我们网站模板小莉帮忙郑州阳光男科医院
  • 上海门户网站怎么登录永州网站制作