一个线程进入run方法体开始运行了,还可以被阻塞的?(没有任何休眠与等待)

INTEL_CHIP 2016-09-05 11:49:24
public class TESTHTREAD implements Runnable {
public static void main(String[] args) {

TESTHTREAD testhtread = new TESTHTREAD();
Thread t1 = new Thread(testhtread);
t1.start();
start1();
}
public void run() {
System.out.println("Doing Run");
run1();
}

private void run1() {
System.out.println("Doing Run1");
}

private static void start1() {
System.out.println("Doing Start1");
}
}

程序的输出是不固定的,可以理解,但是其中有一个输出不明白,输出如下:
Doing Run
Doing Start1
Doing Run1

这个输出表示t1线程已经进入run方法体开始运行了,那么应该把run方法体运行完毕再由主线程执行start1()方法啊 ?
t1线程对应的栈区已经包含了run1()方法的栈帧了吧,t1线程的栈帧入出栈的时候,主线程怎么就抢到了CPU的呢 ?
能从JVM内存分配机制方面说说吗 ? (剩余分数不多,谢谢大家!)
...全文
855 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_36100887 2016-09-10
  • 打赏
  • 举报
回复
你这里有一个主线程和一个t1 线程在同时执行,cpu多对这两个线程的请求处理时相同的,cpu采用时间片轮转的处理机制,给每个进程分配时间片,也就是说他先对主线程进行操作,之后时间片到了执行下一个时间片,下一个时间片可能是T1 线程也可能是主线程这是cpu自己决定的,而我们可以用synchronized关键字或者Lock方法给线程上锁,保证线程执行完
lm_whales 2016-09-08
  • 打赏
  • 举报
回复
这是C#,还是java 还是别的什么? 这里 println 应该针对多线程做了同步 不然的话 应该类似这么输出: Doing RDoin ung StDoing R art1un1 比你这里的输出,要混乱多了 以前的C,C++ 多线程控制台输出,都这味道 不过有些编译器对输出做了同步 同一个输出函数的一次执行过程中的输出 不会和另一次执行的结果交错输出。
NewMoons 2016-09-08
  • 打赏
  • 举报
回复
楼主首先要明白什么是原子代码:cpu最小执行代码单元; 比如i++,其实在编译成class文件到cpu执行的时候可能不止一行代码,可能被拆分成几行代码。 多线程情况下,如果每个线程的代码中不止一个原子代码,那就可能会相互交替执行。 比如线程1和2都有三行原子代码,并不是说线程2先开始执行,就一定把三行执行完才去执行线程1,而可能这三行都是交替执行,而且顺序在没有加代码锁(就是synchronized)的情况下完全是随机的。 可能如下: 线程2原子代码1 线程2原子代码2 线程1原子代码1 线程2院子代码3 线程1原子代码2 线程1院子代码3
INTEL_CHIP 2016-09-07
  • 打赏
  • 举报
回复
引用 13 楼 soton_dolphin 的回复:
[quote=引用 11 楼 INTEL_CHIP 的回复:] [quote=引用 10 楼 soton_dolphin 的回复:] [quote=引用 9 楼 INTEL_CHIP 的回复:] [quote=引用 5 楼 soton_dolphin 的回复:] start()的意思是这个线程给cpu发了个信号,通知cpu我已经准备好跑了,你可以随时启动我。但是具体cpu什么时候给这条线程分配时间跑是不保证的,有可能立即就执行,也可能等一段时间再执行。
第一行就已经开始输出:Doing Run了,说明CPU首先为t1线程分配时间片了,那为什么不继续执行run()方法体内的run1()方法呢 ? t1线程在哪里被阻塞了一下而被主线程占用CPU,从而输出了第二行的Doing Start1 [/quote] 还是那个原理,cpu分配给不同线程的时间是不确定的,线程的执行不受程序的控制。如果你反复执行这个程序,输出结果不是每一次都一样的[/quote] CPU分配给不同线程的时间是不确定的,如果时间片到了,即使线程在栈区内没有把全部的方法链执行完毕,也很可能被其他线程抢占CPU,从而引起阻塞 ? [/quote] 所以有些情况要用synchronized 关键字告诉cpu我要求这段代码一起执行,不要断开,不要被其他线程打搅。[/quote] synchronized可以让CPU保证单个synchronized方法体内部的指令流是顺序执行的 ? 以及多个synchronized方法之间的顺序执行 ?
soton_dolphin 2016-09-07
  • 打赏
  • 举报
回复
引用 11 楼 INTEL_CHIP 的回复:
[quote=引用 10 楼 soton_dolphin 的回复:] [quote=引用 9 楼 INTEL_CHIP 的回复:] [quote=引用 5 楼 soton_dolphin 的回复:] start()的意思是这个线程给cpu发了个信号,通知cpu我已经准备好跑了,你可以随时启动我。但是具体cpu什么时候给这条线程分配时间跑是不保证的,有可能立即就执行,也可能等一段时间再执行。
第一行就已经开始输出:Doing Run了,说明CPU首先为t1线程分配时间片了,那为什么不继续执行run()方法体内的run1()方法呢 ? t1线程在哪里被阻塞了一下而被主线程占用CPU,从而输出了第二行的Doing Start1 [/quote] 还是那个原理,cpu分配给不同线程的时间是不确定的,线程的执行不受程序的控制。如果你反复执行这个程序,输出结果不是每一次都一样的[/quote] CPU分配给不同线程的时间是不确定的,如果时间片到了,即使线程在栈区内没有把全部的方法链执行完毕,也很可能被其他线程抢占CPU,从而引起阻塞 ? [/quote] 所以有些情况要用synchronized 关键字告诉cpu我要求这段代码一起执行,不要断开,不要被其他线程打搅。
soton_dolphin 2016-09-07
  • 打赏
  • 举报
回复
引用 11 楼 INTEL_CHIP 的回复:
[quote=引用 10 楼 soton_dolphin 的回复:] [quote=引用 9 楼 INTEL_CHIP 的回复:] [quote=引用 5 楼 soton_dolphin 的回复:] start()的意思是这个线程给cpu发了个信号,通知cpu我已经准备好跑了,你可以随时启动我。但是具体cpu什么时候给这条线程分配时间跑是不保证的,有可能立即就执行,也可能等一段时间再执行。
第一行就已经开始输出:Doing Run了,说明CPU首先为t1线程分配时间片了,那为什么不继续执行run()方法体内的run1()方法呢 ? t1线程在哪里被阻塞了一下而被主线程占用CPU,从而输出了第二行的Doing Start1 [/quote] 还是那个原理,cpu分配给不同线程的时间是不确定的,线程的执行不受程序的控制。如果你反复执行这个程序,输出结果不是每一次都一样的[/quote] CPU分配给不同线程的时间是不确定的,如果时间片到了,即使线程在栈区内没有把全部的方法链执行完毕,也很可能被其他线程抢占CPU,从而引起阻塞 ? [/quote] 对的,cpu 看到的只是一条一条的指令,而不是整个大括号包裹的方法块。
INTEL_CHIP 2016-09-07
  • 打赏
  • 举报
回复
引用 10 楼 soton_dolphin 的回复:
[quote=引用 9 楼 INTEL_CHIP 的回复:] [quote=引用 5 楼 soton_dolphin 的回复:] start()的意思是这个线程给cpu发了个信号,通知cpu我已经准备好跑了,你可以随时启动我。但是具体cpu什么时候给这条线程分配时间跑是不保证的,有可能立即就执行,也可能等一段时间再执行。
第一行就已经开始输出:Doing Run了,说明CPU首先为t1线程分配时间片了,那为什么不继续执行run()方法体内的run1()方法呢 ? t1线程在哪里被阻塞了一下而被主线程占用CPU,从而输出了第二行的Doing Start1 [/quote] 还是那个原理,cpu分配给不同线程的时间是不确定的,线程的执行不受程序的控制。如果你反复执行这个程序,输出结果不是每一次都一样的[/quote] CPU分配给不同线程的时间是不确定的,如果时间片到了,即使线程在栈区内没有把全部的方法链执行完毕,也很可能被其他线程抢占CPU,从而引起阻塞 ?
soton_dolphin 2016-09-07
  • 打赏
  • 举报
回复
引用 9 楼 INTEL_CHIP 的回复:
[quote=引用 5 楼 soton_dolphin 的回复:] start()的意思是这个线程给cpu发了个信号,通知cpu我已经准备好跑了,你可以随时启动我。但是具体cpu什么时候给这条线程分配时间跑是不保证的,有可能立即就执行,也可能等一段时间再执行。
第一行就已经开始输出:Doing Run了,说明CPU首先为t1线程分配时间片了,那为什么不继续执行run()方法体内的run1()方法呢 ? t1线程在哪里被阻塞了一下而被主线程占用CPU,从而输出了第二行的Doing Start1 [/quote] 还是那个原理,cpu分配给不同线程的时间是不确定的,线程的执行不受程序的控制。如果你反复执行这个程序,输出结果不是每一次都一样的
INTEL_CHIP 2016-09-07
  • 打赏
  • 举报
回复
引用 5 楼 soton_dolphin 的回复:
start()的意思是这个线程给cpu发了个信号,通知cpu我已经准备好跑了,你可以随时启动我。但是具体cpu什么时候给这条线程分配时间跑是不保证的,有可能立即就执行,也可能等一段时间再执行。
第一行就已经开始输出:Doing Run了,说明CPU首先为t1线程分配时间片了,那为什么不继续执行run()方法体内的run1()方法呢 ? t1线程在哪里被阻塞了一下而被主线程占用CPU,从而输出了第二行的Doing Start1
INTEL_CHIP 2016-09-07
  • 打赏
  • 举报
回复
线程在执行过程中,有方法调用,就会访问内存的线程共享的方法区,这个时候就可能发生线程切换 ?
INTEL_CHIP 2016-09-07
  • 打赏
  • 举报
回复
引用 4 楼 sean_0xiao 的回复:
操作系统在对各个线程进行处理是,是按照特定的时间片为每个线程设置时间,当线程在执行的过程中,时间片到了,就进入阻塞状态,将cpu分配给给其他进程。而阻塞的进程将等待下次被调用!
一个线程在执行过程中会有多次栈区的栈帧增减(方法嵌套调用), 但是线程的嵌套子方法还没有执行完毕,如果时间片到了,也是很可能引起阻塞,CPU很可能就去调用其他线程了 ? 线程是CPU调度的最小单位,我的理解是线程在自己的栈区没有执行结束之前,如果没有主动采取sleep/wait之类的阻塞,是不能被其他线程所中断的 。 如果线程执行过程中因为时间片问题可以被中断,那CPU调度的最小单位就不是线程了
INTEL_CHIP 2016-09-07
  • 打赏
  • 举报
回复
synchronized可以让CPU保证在同一把对象锁的前提下, 对象的单个synchronized方法体内部的指令流是顺序执行的 ? 以及多个synchronized方法之间的顺序执行 ?
纸上谈瓜 2016-09-06
  • 打赏
  • 举报
回复
有2个线程运行,,一是main方法所在的主线程,二是t1 ,而每个线程是内部是顺序执行。。线程间是没有顺序的。所以,哪个线程先运行或者先输出是不确定的。但是主进程运行完毕会导致所有依赖、直接或间接的靠主进程启动的线程提前结束。
soton_dolphin 2016-09-06
  • 打赏
  • 举报
回复
start()的意思是这个线程给cpu发了个信号,通知cpu我已经准备好跑了,你可以随时启动我。但是具体cpu什么时候给这条线程分配时间跑是不保证的,有可能立即就执行,也可能等一段时间再执行。
sean_0xiao 2016-09-06
  • 打赏
  • 举报
回复
操作系统在对各个线程进行处理是,是按照特定的时间片为每个线程设置时间,当线程在执行的过程中,时间片到了,就进入阻塞状态,将cpu分配给给其他进程。而阻塞的进程将等待下次被调用!
zycxnanwang 2016-09-06
  • 打赏
  • 举报
回复
引用 2 楼 INTEL_CHIP的回复:
[quote=引用 1 楼 fangmingshijie 的回复:] main方法本身也是一个线程,这相当于多线程运行了
是两个线程在运行,我的问题是两个线程没有任何阻塞与等待,在其中A线程的生命周期内刚刚执行完一个方法体,怎么就可以切换到B线程去执行其他方法体了呢 ? A线程的生命周期还没有结束啊 ![/quote] 多线程是同时运行的,不是要等谁…
INTEL_CHIP 2016-09-06
  • 打赏
  • 举报
回复
引用 1 楼 fangmingshijie 的回复:
main方法本身也是一个线程,这相当于多线程运行了
是两个线程在运行,我的问题是两个线程没有任何阻塞与等待,在其中A线程的生命周期内刚刚执行完一个方法体,怎么就可以切换到B线程去执行其他方法体了呢 ? A线程的生命周期还没有结束啊 !
  • 打赏
  • 举报
回复
main方法本身也是一个线程,这相当于多线程运行了

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧