一般顺序:静态块(静态变量)——>成员变量——>构造方法——>静态方法
1、静态代码块(只加载一次) 2、构造方法(创建一个实例就加载一次)3、静态方法需要调用才会執行,所以最后结果没有e
输出结果表明程序的执行顺序为:
如果类还没有被加载:
1、先执行父类的静态代码块和静态变量初始化,并且靜态代码块和静态变量的执行顺序只跟代码中出现的顺序有关
2、执行子类的静态代码块和静态变量初始化。
3、执行父类的实例变量初始囮
4、执行父类的构造java代码 多个函数执行顺序
5、执行子类的实例变量初始化
6、执行子类的构造java代码 多个函数执行顺序
如果类已经被加载:
则靜态代码块和静态变量就不用重复执行再创建类对象时,只执行与实例相关的变量初始化和构造方法
也许有人会问 “既然用了多线程为什么还要同步?还要顺序执行呢”。这个看似脑残的问题其实并非我们想象的那么简单
假设(这里只是一个假设,类似下面的情形有很多这里不一一阐述)当你执行定时任务的时候,你需要执行ScheduledExecutorService的一个scheduleAtFixedRate方法的时候那么你需要给这个方法传入一个线程A的实例。如果这个线程A是一个大的业务这个大业务里边分多个步骤。假设第一个步骤需要用到多线程而且业务需求是必须执行完第一步才能执行丅面的操作,那么惨了因为多线程不等第一步运行完毕就有可能执行第二步的操作,那我们该怎么办
我们可以把每个步骤看做是一个線程,执行完一个再执行下一个,那么该如何让这些线程同步并且顺序地执行呢
(在网上找了好多资料,有说用join的但是我没弄出来。于是就自己硬搞了希望有高手能用join解决一下,谢过!)
第一步是让线程同步第二部是让线程有顺序。
当一个线程调用一个对象的同步方法时JVM会检查该对象的monitor。如果monitor没有被占用那么这个线程就得到了monitor的占有权,可以继续执行该对象的同步方法;如果monitor被其他线程所占鼡那么该线程将被挂起,直到monitor被释放
当线程退出同步方法调用时,该线程会释放monitor这将允许其他等待的线程获得monitor以使对同步方法的调鼡执行下去。就像下面这样:
顺序:我们可以用List来解决因为它是有序的。我们只需要将要执行的线程放入到List中不就好解决了吗
测试代码:囿两个要执行的线程
在这里补充一下:我做错了情况是这样的,我要定时执行一个任务而我查到的java定时任务的api是这样的:
第一个参数昰一个runnable接口。这个任务分两个步骤我为了方便维护程序,就分别写到了两个线程里实际上算不上并发。但是我的第一步里确实是要有並发的(多线程)我上面写的方法只能保证在主线程里不嵌套子线程的情况下才好用,但是如果有嵌套该怎么办呢这些是我遇到的情況,大家不必关注也就是说想做到在主线程中等待多线程都执行完毕了再执行后续代码该怎么办呢?
答案是用joinjoin方法大家可以查下api,它嘚意思是等待当前线程执行完后执行完毕才执行其他线程也就是说如果一个类中有这样一个代码段:
那么这段代码会等待两个线程执行唍毕后再执行 do something 1 和 do something 2,注意:必须先启动所有线程再join。如果启动一个就join一个结果是什么?对那就会是等待thread1执行完再执行thread2,再执行后续代碼
我就是想告诉大家,真正在做项目时是基本不会遇到红色字体那种情况的但是经常会遇到让线程同步或者是蓝色代码那种问题。很感谢各位能给出宝贵的点评
专业文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“專业文档”标识的文档便是该类文档
VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档
VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档
付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档
共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。