知识点一:
解析这两幅图片我起了两个线程,第一个线程参数是0,第二个线程参数是1,参数代表几号卖出
图一:先调的第一个线程,但是打印的结果是1先卖出不是0
图二:先调的第一个线程,但是打印的结果是0先卖出不是1
为什么会这样呢,结合知识点二,线程回调函数的参数这些在堆上,创建自己的栈的时间不固定,有可能第一个线程创建好自己的栈,第二个线程才创建好自己的栈,有可能第一个线程创建好自己的栈,并且把10张票卖完了,第二个线程的栈才建好
结论:多线程运行的随机性,不确定性,不可预测性
知识点二:
问:
还是上面两幅图,我调用第一个函数,参数0,回调函数fun,然后我又调用第二个函数,参数1,回调函数fun,那我应该在运行完第一次0的回调函数后都是参数为1的回调函数,为什么两幅图显示运行到后面都还有参数0,为什么没有被改
解:
如果线程函数调用和线程回调函数的参数(不是创建线程的函数的参数)都像普通函数一样按顺序的压着,那运行就不该出现上面的情况
线程的回调函数和回调函数的参数是在堆上,如图
线程的回调函数运行是在操作系统开辟的栈上(看到线程,找了块大小足够的地方开辟的空间)
知识点三:
运行的线程在或者即将运行的线程在忙线程队列
遇sleep必切入闲线程队列
sleep休眠的时间过后放入忙线程队列尾部