线程栈是个什么东东?

999朵玫瑰 2010-01-19 02:49:33
如题。
还有,“线程的调度是JVM的一部分,在一个CPU的机器上上,实际上一次只能运行一个线程。一次只有一个线程栈执行。JVM线程调度程序决定实际运行哪个处于可运行状态的线程。“这句话是什么意思?
...全文
667 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
weihthchk 2010-02-02
  • 打赏
  • 举报
回复
进来认个错。
默认的JVM线程是JVM进程自行调度的,如果运行Java程序时不加-native参数的话。
加上-native,那么JVM使用操作系统的调度功能来实现线程调度,此时一个Java线程可能是一个操作系统进程。
xxpp688 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 onlyonelove 的回复:]
如题。
还有,“线程的调度是JVM的一部分,在一个CPU的机器上上,实际上一次只能运行一个线程。一次只有一个线程栈执行。JVM线程调度程序决定实际运行哪个处于可运行状态的线程。“这句话是什么意思?
[/Quote]

你把堆栈,和堆的工作原理好好看一下;还有他们占用CPU的方式看一下你就明白了。

你说:“在一个CPU机器上,实际一次只能运行一个线程”
这句话不太精确,他是有前提条件的:
在单处理器单线程下只运行一次,如果系统有多个处理器核心或支持多线程,则第一次只使用一个线程,第二次运行使用全部处理器核心和线程。

我们不需要考虑那么多,我们只需要知道:CPU在同一时刻下只运行一个进程,二Java支持多线程(虽然我们可以边听歌,边打游戏···其实他是把一个运行完停下来在运行下一个因为CPU执行速度快所以我们感觉不到罢了)。
关于jvm的调度你可以看看线程那一章(像线程优先级了···)。
zhouxingyu896 2010-01-24
  • 打赏
  • 举报
回复
学习
lianghua19 2010-01-23
  • 打赏
  • 举报
回复
线程调度的问题,按我理解就是JVM选择性的从若干线程中按一定调度策略选择一条作为当前线程来执行。
如果不懂可以看看操作系统的进程管理
dajiadebeibei9 2010-01-22
  • 打赏
  • 举报
回复
一个进程可包含多个线程,一个进程中的线程共享进程中的资源,但是CPU一次只能让一个进程占用,JVM就相当于调度机,调度合适的进程运行,通俗的说,一个CPU在同一个时刻只有一个进程使用,一个进程中可以有多个线程执行。
SambaGao 2010-01-22
  • 打赏
  • 举报
回复
图没有出来。


public class TestThread {

public static void main(String args[]) {

System.out.println("Hello") ; 当运行main主线程就进到栈A里
new TestThread().method() ;
}

public void method() {

Runnable r = new MyRunnable() ;
Thread t = new MyThread(r) ;
t.start() ; //当到这儿的时候 run()就进到了栈B里.

}
}
再有线程出来的时候就会排列,最后形成一个线程栈。


有什么不对的地方请方家指出.
SambaGao 2010-01-22
  • 打赏
  • 举报
回复


999朵玫瑰 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 nihaozhangchao 的回复:]
图没有出来。
Java codepublicclass TestThread {publicstaticvoid main(String args[]) {

System.out.println("Hello") ; 当运行main主线程就进到栈A里new TestThread().method() ;
}publicvoid method() {

Runnable r=new MyRunnable() ;
Thread t=new MyThread(r) ;
t.start() ;//当到这儿的时候 run()就进到了栈B里.
}
}
再有线程出来的时候就会排列,最后形成一个线程栈。

有什么不对的地方请方家指出.
[/Quote]谢谢。还是你这个说的明白点。
我可不可以这样理解呢?:栈B依赖于栈A。
也就是说如果xx线程创建并启动了xx2线程。只有当xx2线程退出以后,线程xx才会退出。
如果xx2没有退出,即使xx线程执行到run方法的结尾,也要等到xx2线程退出以后,xx才会退出?

对了,你贴出来的代码在哪一篇博客里阿,能否把链接地址给一下,我也要去看看:)
jksnt_2000 2010-01-22
  • 打赏
  • 举报
回复
路过
hzq237 2010-01-20
  • 打赏
  • 举报
回复
路过。学习
myself100 2010-01-20
  • 打赏
  • 举报
回复
多线程处理
树成 2010-01-19
  • 打赏
  • 举报
回复
回楼主“一个cpu只能运行一个线程”的概念。
一般来说,一个cpu在一个时间片段之内只能执行一条命令,也就是说一个cpu其真实情况只能是单进程与单线程的,而所谓的多线程并行执行只是一个早操作系统级别上的宏观概念,操作系统把cpu的不同时间片段分别发放给不同线程或进程,而从宏观上看似这些进程和线程是并行运行的,单实际从cpu运行的微观层面来看,其实是这一段时间执行一个线程的一段命令,然后暂停这个线程,再在另外一段时间执行另外一个线程的命令。这样的做法在于高度利用cpu的执行能力,因为任何一个程序或者线程不可能总是处于执行阶段,他们可能处于挂起或者停滞时段,而程序本身却没有结束,结果这样一段时间cpu没有被利用,而且又导致其它程序不得不等待这个程序的完成才能继续拥有cpu资源,因此操作系统则剥夺挂起或者停滞的程序对cpu资源的掌控而分配给需要执行的程序。而这种分配在宏观中被感觉出,这两个程序是同时运行的。
pywepe 2010-01-19
  • 打赏
  • 举报
回复
你写一个程序 实现一边打印0,一边打印a,注意是"一边"

怎么做?
ftcool 2010-01-19
  • 打赏
  • 举报
回复
我指的是jvm内
ftcool 2010-01-19
  • 打赏
  • 举报
回复
weihthchk

你纯粹扯淡
ftcool 2010-01-19
  • 打赏
  • 举报
回复
weihthchk

(Spectrum)

等 级:

晕,服了气了
nihuajie05 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 healer_kx 的回复:]
线程栈就是一个线程里面函数调用的堆栈。

Java从main开始,然后调用其他的函数,而最后也是从main退出,这不就是栈吗?
[/Quote]
楼主先去看看什么叫做栈。
英文叫stack的概念
然后套用在线程上,自然就懂了
树成 2010-01-19
  • 打赏
  • 举报
回复
java的线程概念与操作系统的线程概念是不同的,java的线程概念差不多与windows线程概念一致,但是java既然目标是跨平台语言,那么它的线程机制概念是在所有平台上都是一样的,但是实际实现又不是如此,这要从进程与线程的概念中谈起:
首先在windows系列系统中,进程所拥有的内存空间都是独立的,此进程所持有的内存其它进程是不可以直接访问的,而且在windows系统内部一个进程就是一个运行的运用程序,而为了解决应用程序内部的并行问题便有了线程的概念,线程没有自我独立的内存空间,在一个进程中所有的线程共享这个进程所持有的内存空间。
而在某些Unix系统当中,进程所持有的内存空间是可以被其他进程进行访问的,而且一个运用程序可能不止一个进程,这样的系统没有线程的概念,运用的并行问题有多个进程协调来解决。
java为了实现平台无关性,必须解决这样一个问题,因此java建立了一套自己的进程与线程机制,这套机制与windows系统的颇为相似,但是底层实现确实根据不同平台的机制进行实现,比如windows下的线程机制就是利用windows本身的线程机制加上某些改进进行处理的,而某些没有线程的Unix系统则是用进程来替代线程进行实现的,然后在其中确立一个主进程来替代自身进程。虽然这样的实现解决了大部分的线程平台无关性,但是也有些无法解决的,比如线程优先级,windows下线程是有优先级的,但是某些Linux系统,某些Unix系统,进程与线程直接不区分优先级,因此优先级在每个系统下的表现形式就不一样,例如低优先级的进程可能在windows下被饿死,但是在linux下,根本就无法感觉它优先级较低,还有,在建立一个线程与杀死一个线程运用所带来的开销也会不同,在windows下建立或杀死线程可能是不需要什么开销的,但是在没有线程概念的进程行操作系统中,杀死或者建立线程可能带来巨大开销。
weihthchk 2010-01-19
  • 打赏
  • 举报
回复
3楼的理解有误。Java是多线程的,可以理解;但是没有规定是单进程啊。在不同的操作系统里实现不同,Java也可能用系统进程来实现“Java线程”。
ftcool 2010-01-19
  • 打赏
  • 举报
回复
这个问题不好向你解释!

java是单进程多线程的,java程序都运行于java虚拟(jvm)机环境中,java程序可以理解成一个进程,这个进程又包含很多线程,jvm会根据线程的优先级调度线程(当然也和具体操作系统有关)
加载更多回复(2)

62,612

社区成员

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

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