精华内容
下载资源
问答
  • 一个JVM进程启动后里面有几个线程

    千次阅读 2012-07-24 09:16:48
    在写Java程序时,通常我们管只有一个main函数(而没有别的Thread或Runnable的程序)叫单线程... 刚装了一个NetBeans6.0,里面带了一个分析器包,于是写了一个HelloWorld程序,检验了一下JVM一启动,里面会有几个线程

            在写Java程序时,通常我们管只有一个main函数(而没有别的Thread或Runnable的程序)叫单线程程序。但是我们写的这个所谓的单线程程序只是JVM这个程序中的一个线程,JVM本身是一个多线程的程序,至少得有一个垃圾收集器线程吧。

            刚装了一个NetBeans6.0,里面带了一个分析器包,于是写了一个HelloWorld程序,检验了一下JVM一启动,里面会有几个线程:

            结果是:除了我的main线程以外,还有四个线程:

    • Finalizer 线程:在垃圾回收之前执行“对象完成”的Java系统线程;
    • Signal Dispatcher 线程:为JVM处理本地操作系统信号的Java系统线程;
    • Reference Handler 线程:将挂起的对象放到队列中的高优先级Java系统线程。
    • Attach Listener 线程:用户线程。

    我个人的猜测是:

    1、Finalizer 线程的任务就是调用finalize()方法来进行垃圾回收。

    2、Signal Dispatcher 线程的任务就是处理操作系统方面的东西,屏蔽操作系统,使Java达到跨平台的事儿应该是它干的。

    3、Reference Handler线程的任务就是将一个不用的对象打上标记,放到回收对象的队列中,以便于Finalizer线程来进行释放内存操作。

    4、最后一个 Attach Listener 线程:这个应该是我的Java Profile线程了。跟JVM没有关系。

    所以,综上分析可得出:当一个最简单的Java程序启动时,JVM除了我们的main线程外,还会启动3个线程。


    展开全文
  • 进程 线程 程序

    千次阅读 2012-07-17 17:16:59
    进程   对应用程序来说,进程就像一个大容器。在应用程序被运行后,就相当于将应用程序装进容器里了,你可以往容器里加其他东西(如:应用程序在运行...一个进程可以包含若干线程(Thread),线程可以帮助应用程序同时做

    进程 
     对应用程序来说,进程就像一个大容器。在应用程序被运行后,就相当于将应用程序装进容器里了,你可以往容器里加其他东西(如:应用程序在运行时所需的变量数据、需要引用的DLL文件等),当应用程序被运行两次时,容器里的东西并不会被倒掉,系统会找一个新的进程容器来容纳它。 

      进程是由进程控制块、程序段、数据段三部分组成。一个进程可以包含若干线程(Thread),线程可以帮助应用程序同时做几件事(比如一个线程向磁盘写入文件,另一个则接收用户的按键操作并及时做出反应,互相不干扰),在程序被运行后中,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可以根据需要自行添加或删除相关的线程。 
    是可并发执行的程序。在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位,也是称活动、路径或任务,它有两方面性质:活动性、并发性。进程可以划分为运行、阻塞、就绪三种状态,并随一定条件而相互转化:就绪--运行,运行--阻塞,阻塞--就绪。 

      进程为应用程序的运行实例,是应用程序的一次动态执行。看似高深,我们可以简单地理解为:它是操作系统当前运行的执行程序。在系统当前运行的执行程序里包括:系统管理计算机个体和完成各种操作所必需的程序;用户开启、执行的额外程序,当然也包括用户不知道,而自动运行的非法程序(它们就有可能是病毒程序)。 
      危害较大的可执行病毒同样以“进程”形式出现在系统内部(一些病毒可能并不被进程列表显示,如“宏病毒”),那么及时查看并准确杀掉非法进程对于手工杀毒有起着关键性的作用。 

    进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是 

    死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种 

    功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;用户进程就是所有由你启动的进程。进程是操作系统进行资源分配的单位。 

    在Windows下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。 
    1.进程的引入: 
    多道程序在执行时,需要共享系统资源,从而导致各程序在执行过程中出现相互制约的关系,程序的执行表现出间断性的特征。这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,即我们无法从程序的字面上看出它何时执行,何时停顿,也无法看出它与其它执行程序的关系,因此,程序这个静态概念已不能如实反映程序并发执行过程的特征。为了深刻描述程序动态执行过程的性质,人们引入“进程(Process)”概念。 
    2.进程的概念: 
    进程的概念是60年代初首先由麻省理工学院的MULTICS系统和IBM公司的CTSS/360系统引入的。 
    进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。 
    进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。 
    操作系统引入进程的概念的原因: 
    从理论角度看,是对正在运行的程序过程的抽象; 
    从实现角度看,是一种数据结构,目的在于清晰地刻划动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。 
    3.进程的特征 
    动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的。 
    并发性:任何进程都可以同其他进程一起并发执行 
    独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位; 
    异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进 
    结构特征:进程由程序、数据和进程控制块三部分组成。 
    4.进程与程序的关系 
    程序是指令的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。 
    程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。 
    进程更能真实地描述并发,而程序不能;进程是由程序和数据两部分组成的。 
    进程具有创建其他进程的功能,而程序没有。 
    同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程。也就是说同一程序可以对应多个进程。 
    在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单元都是进程。 



    线程
    是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。 
    线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 
    线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU
    线程的周期 
    新建 就绪 运行 阻塞 死亡 
    线程调度与优先级 
    有线程进入了就绪状态,需要有线程调度程序来决定何时执行,根据优先级来调度. 
    线程组 
    每个线程都是一个线程组的一个成员,线程组把多个线程集成一个对象,通过线程组可以同时对其中的多个线程进行操作.在生成线程时必须将线程放在指定的线程组,也可以放在缺省的线程组中,缺省的就是生成该线程的线程所在的线程组.一旦一个线程加入了某个线程组,不能被移出这个组. 
    守护线程 
    是特殊的线程,一般用于在后台为其他线程提供服务. 
    isDaemon():判断一个线程是否为守护线程. 
    set Daemon():设置一个线程为守护线程. 
    Thread类和Runnable接口 
    Thread类 
    类Thread在包java.lang中定义,它的构造方法如下: 
    public Thread(); 
    public Thread(Rannable target); 
    public Thread(Rannable target,String name); 
    public Thread(String name); 
    public Thread(ThreadGroup group,Rannable target); 
    public Thread(ThreadGroup group, String name); 
    主要方法 
    isActive() 判断是否处于执行状态 
    Suspend() 暂停执行 
    reSume 恢复执行 
    start() 开始执行 
    Stop() 停止执行 
    sleep() 睡眠 
    run() 程序体 
    yield() 向其他线程退让运行权 
    线程优先级 
    Public statuc final int MAX_PRIORITY最高优先级,10 
    Public statuc final int MIN_PRIORITY最低优先级,1 
    Public statuc final int NORM_PRIORITY普通优先级,5 
    Runnable接口 
    Runnable接口中只定义了一个方法run()作为线程体, 
    void run() 

    程序 :
    chénɡ xù 
    ①事情进行的先后次序:工作程序|按程序进行。②指示计算机按解决问题的步骤,实现预期目的而进行操作的一系列语句和指令。一般分为系统程序和应用程序两大类。 
    程序就是为使电子计算机执行一个或多个操作,或执行某一任务,按序设计的计算机指令的集合。

    程序,是现在最吃香的提法。 

    任何单位任何事情,首先强调的就是程序,因为管理界有句名言:细节决定成败。程序就是整治细节最好的工具。于是,现在我们的所有工作,无时无处不在强调程序。 

    因为有了规范的办事程序,现在我们这些平民百姓到
    政府机关办事比原来容易了许多,最起码知道办什么事该找哪个部门,知道办这个事应该用多长时间了。政府公开办事程序,也拉近了和人民群众的关系。好,这是好得很的事。 

    好像是为了印证事物都是一分为二的道理一样,在赞颂程序的同时,我们也看到了程序冷酷的另一面。南宁见义勇为的英雄鲍光蛇在医院冷酷的程序中流尽了最后一滴血,公路收费站的值班人员因救护车交不出十元钱的过路费而坚决不放行救护车,终于使急需救助的患者丧命,……等等的例子,都为我们强调或者说奉为神圣规则的程序优先勾画出了它的原形。 

    程序,是管理方式的一种,是能够发挥出协调高效作用的工具,在我们的社会主义建设事业或者说现代化建设中,应该充分重视它的作用,应该不断地将我们的工作从无序整改到有序。 

    可是,当我们只关注形式而不关注实质的时候,有些事情就发展到了它的反面。程序不是医治百病的灵丹妙药,在它走向反面的时候,它是使那些官僚主义者和视劳苦大众利益如不见的人们推脱掉自己应当承担的责任的最好的挡箭牌。因为越是严密完善的程序,按部就班执行起来越是要付出时间的代价,当时间被浪费了时候,因此引发的其他损失是不应该由模范执行了程序的人来负责的。 

    南宁的这个医院,应该说管理是非常规范化的了。在见义勇为的伤者鲍光蛇被抬进来以后,他们认真地履行了各种应当进行的检查程序,每个人都是负责的。当然,英雄的血流的快了点,让他们的检查程序没有进行完毕。这不是医院的责任!每个大夫都会这样推脱的。事实上,他们也就是这样做了。因为我们从报道中看到,大夫说,医院里面这样的事情多了,急惊风遇上慢郎中,这是历史留下来的遗产。总不能因为鲍光蛇就改变了我们的老传统吧,再说我们现在的管理可比以前规范得多了。 

    再把话说得远一点。 

    这些年来,我们的管理工作在完善程序的路上走得是比较远了些。现在看我们的各行各业,哪一家的工作程序不是越来越完善,越来越规范,越来越让人摸不着头脑。就拿法律来说吧,这可是最规范的程序了。当初,我们没有刑法,没有民法,也没有刑诉法民诉法和行政诉讼法,据说这是老一辈无产阶级革命家轻视法律、没有法律意识的结果。但是社会的刑事发案率在百万分之五左右。全国的刑事案件总数,直到八十年代中期,一直徘徊在20万件上下。现在,我们有了
    刑法,有了民法,有了专门的公司法票据法合同法,法典和法学论著汗牛充栋,许多学者著作等身,办案的程序比以前严密的太多了,那就根本不是一个档次了。程序严密了,效果如何呢?倒是公开报道的数据能说明问题,现在全国刑事案件的发案数已经跃上了百万件大关,民事案件更是一个天上一个地下的差距,每年都数千万件了。与此相应,警察的数量、法官的数量、律师的数量,也都比改革开放前翻了几番。毕竟吗,老鼠多了,抓老鼠的猫一定也要多起来才行,不然,老鼠多猫少,生态就不平衡了,不是治不了老鼠,就是累死猫。反正这两样都不是和谐社会所需要的。程序被异化的另一个例子是民工工资。据说全国的民工工资被拖欠了千亿元,据说,按程序追讨,民工还要再付三千到五千亿元的费用。得到的没有付出的多,那这些民工还能按程序追讨自己的工资吗? 

    说了这么多,我自己都糊涂了,这程序是好东西呢还是坏东西呢?还是两个方面都有那么一点? 

    想了好长时间,忽然觉得明白了一点,说这程序是好还是不好,不在这程序本身,关键是看你是用程序的还是制定程序的!

    为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合
    计算机中的程序在港澳台地区称为程式
    是人们求解问题的逻辑思维活动的代码化描述
    程序的最重要的目的是:
    便于阅读、交流

    位于“开始”菜单中的一个文件夹,在中文XP操作系统里的目录是C:\Documents and Settings\XX(你的用户名)\「开始」菜单\程序,安装的软件在里面都有快捷方式。 
    程序:用汇编语言、高级语言等开发编制出来的可以运行的文件。

    应用程序,在计算机中称可执行文件(后缀名一般为.exe)。我们玩的游戏一般都是应用程序(但现在后缀名为.swf的Flash影片类的游戏也比较流行)


    进程和程序区别和联系表现在以下方面: 
    1)程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是 
    一个静态的实体。而进程则不同,它是程序在某个数据集上的执行。 
    进程是一个动态的实体,它有自己的生命周期。它因创建而产生,因 
    调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被 
    撤消。反映了一个程序在一定的数据集上运行的全部动态过程。 
    2)进程和程序并不是一一对应的,一个程序执行在不同的数据集上就成 
    为不同的进程,可以用进程控制块来唯一地标识每个进程。而这一点 
    正是程序无法做到的,由于程序没有和数据产生直接的联系,既使是 
    执行不同的数据的程序,他们的指令的集合依然是一样的,所以无法 
    唯一地标识出这些运行于不同数据集上的程序。一般来说,一个进程 
    肯定有一个与之对应的程序,而且只有一个。而一个程序有可能没有 
    与之对应的进程(因为它没有执行),也有可能有多个进程与之对应(运 
    行在几个不同的数据集上)。 
    3)进程还具有并发性和交往性,这也与程序的封闭性不同。 
    ---------------------------------------------------------------------------------------------- 

    进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 

    简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 
    线程的划分尺度小于进程,使得多线程程序的并发性高。 
    另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 
    线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 
    从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 

    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 
    线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 
    一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 

    ---------------------------------------------------------------------------------------------- 

    进程和线程的区别 

    说法一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 

    线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 

    一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行 



    说法二:进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 

    简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 

    线程的划分尺度小于进程,使得多线程程序的并发性高。 

    另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 

    线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 

    从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 



    说法三:多线程共存于应用程序中是现代操作系统中的基本特征和重要标志。用过UNIX操作系统的读者知道进程,在UNIX操作系统中,每个应用程序的执行都在操作系统内核中登记一个进程标志,操作系统根据分配的标志对应用程序的执行进行调度和系统资源分配,但进程和线程有什么区别呢? 

    进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 

    线程的划分尺度小于进程,使得多线程程序的并发性搞。 

    另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 

    线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 

    从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 

    进程(Process)是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例,进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统对应用程序进程的控制来实现的。 

    C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。这时,处在可执行状态中的应用程序称为进程。从用户角度来看,进程是应用程序的一个执行过程。从操作系统核心角度来看,进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体。多任务环境下应用程序进程的主要特点包括: 

    ●进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间; 

    ●进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型; 

    ●从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。 

    在Unix操作系统启动过程中,系统自动创建swapper、init等系统进程,用于管理内存资源以及对用户进程进行调度等。在Unix环境下无论是由操作系统创建的进程还要由应用程序执行创建的进程,均拥有唯一的进程标识(PID)。 

    说法四:应用程序在执行过程中存在一个内存空间的初始入口点地址、一个程序执行过程中的代码执行序列以及用于标识进程结束的内存出口点地址,在进程执行过程中的每一时间点均有唯一的处理器指令与内存单元地址相对应。 

    Java语言中定义的线程(Thread)同样包括一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。但是进程与线程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流。 

    Unix操作系统和Microsoft Windows操作系统支持多用户、多进程的并发执行,而Java语言支持应用程序进程内部的多个执行线程的并发执行。多线程的意义在于一个应用程序的多个逻辑单元可以并发地执行。但是多线程并不意味着多个用户进程在执行,操作系统也不把每个线程作为独立的进程来分配独立的系统资源。进程可以创建其子进程,子进程与父进程拥有不同的可执行代码和数据内存空间。而在用于代表应用程序的进程中多个线程共享数据内存空间,但保持每个线程拥有独立的执行堆栈和程序执行上下文(Context)。 

    基于上述区别,线程也可以称为轻型进程 (Light Weight Process,LWP)。不同线程间允许任务协作和数据交换,使得在计算机系统资源消耗等方面非常廉价。 

    线程需要操作系统的支持,不是所有类型的计算机都支持多线程应用程序。Java程序设计语言将线程支持与语言运行环境结合在一起,提供了多任务并发执行的能力。这就好比一个人在处理家务的过程中,将衣服放到洗衣机中自动洗涤后将大米放在电饭锅里,然后开始做菜。等菜做好了,饭熟了同时衣服也洗好了。 

    需要注意的是:在应用程序中使用多线程不会增加 CPU 的数据处理能力。只有在多CPU 的计算机或者在网络计算体系结构下,将Java程序划分为多个并发执行线程后,同时启动多个线程运行,使不同的线程运行在基于不同处理器的Java虚拟机中,才能提高应用程序的执行效率。
    展开全文
  • 进程线程的区别(超详细)

    万次阅读 多人点赞 2019-10-03 21:57:46
    个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。 线程 进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程...

    进程和线程

    进程

    一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。

    任务管理器

    线程

    进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。

    与进程不同的是同类的多个线程共享进程的方法区资源,但每个线程有自己的程序计数器虚拟机栈本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

    Java 程序天生就是多线程程序,我们可以通过 JMX 来看一下一个普通的 Java 程序有哪些线程,代码如下。

    public class MultiThread {
    	public static void main(String[] args) {
    		// 获取 Java 线程管理 MXBean
    		ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
    		// 不需要获取同步的 monitor 和 synchronizer 信息,仅获取线程和线程堆栈信息
    		ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
    		// 遍历线程信息,仅打印线程 ID 和线程名称信息
    		for (ThreadInfo threadInfo : threadInfos) {
    			System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());
    		}
    	}
    }
    

    上述程序输出如下(输出内容可能不同,不用太纠结下面每个线程的作用,只用知道 main 线程执行 main 方法即可):

    [6] Monitor Ctrl-Break //监听线程转储或“线程堆栈跟踪”的线程
    [5] Attach Listener //负责接收到外部的命令,而对该命令进行执行的并且把结果返回给发送者
    [4] Signal Dispatcher // 分发处理给 JVM 信号的线程
    [3] Finalizer //在垃圾收集前,调用对象 finalize 方法的线程
    [2] Reference Handler //用于处理引用对象本身(软引用、弱引用、虚引用)的垃圾回收的线程
    [1] main //main 线程,程序入口
    

    从上面的输出内容可以看出:一个 Java 程序的运行是 main 线程和多个其他线程同时运行

    进程与线程的区别总结

    线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。

    根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

    资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

    包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

    内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

    影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

    执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

    从 JVM 角度说进程和线程之间的关系(重要)

    图解进程和线程的关系

    下图是 Java 内存区域,通过下图我们从 JVM 的角度来说一下线程和进程之间的关系。

    在这里插入图片描述

    从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的方法区 (JDK1.8 之后的元空间)资源,但是每个线程有自己的程序计数器虚拟机栈本地方法栈

    程序计数器为什么是私有的?

    程序计数器主要有下面两个作用:

    1. 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
    2. 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。

    需要注意的是,如果执行的是 native 方法,那么程序计数器记录的是 undefined 地址,只有执行的是 Java 代码时程序计数器记录的才是下一条指令的地址。

    所以,程序计数器私有主要是为了线程切换后能恢复到正确的执行位置

    虚拟机栈和本地方法栈为什么是私有的?

    • 虚拟机栈:每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。
    • 本地方法栈:和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。

    所以,为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的。

    一句话简单了解堆和方法区

    堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象 (所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    多进程和多线程区别

    多进程:操作系统中同时运行的多个程序

    多线程:在同一个进程中同时运行的多个任务

    举个例子,多线程下载软件,可以同时运行多个线程,但是通过程序运行的结果发现,每一次结果都不一致。 因为多线程存在一个特性:随机性。造成的原因:CPU在瞬间不断切换去处理各个线程而导致的,可以理解成多个线程在抢CPU资源。

    多线程提高CPU使用率

    多线程

    多线程并不能提高运行速度,但可以提高运行效率,让CPU的使用率更高。但是如果多线程有安全问题或出现频繁的上下文切换时,运算速度可能反而更低。

    Java中的多线程

    Java程序的进程里有几个线程:主线程,垃圾回收线程(后台线程)等

    在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。

    Java支持多线程,当Java程序执行main方法的时候,就是在执行一个名字叫做main的线程,可以在main方法执行时,开启多个线程A,B,C,多个线程 main,A,B,C同时执行,相互抢夺CPU,Thread类是java.lang包下的一个常用类,每一个Thread类的对象,就代表一个处于某种状态的线程

    展开全文
  • Android App进程中最少有几个线程

    千次阅读 2019-03-26 14:48:03
    当应用程序组件启动,且应用程序没有其他组件运行时,Android系统为这个应用程序启动一个新的Linux进程,并开始运行一个主线程。默认情况下,同一应用程序的所有组件都在同一进程的主线程中运行。如果应用程序组件...

    当应用程序组件启动,且应用程序没有其他组件运行时,Android系统为这个应用程序启动一个新的Linux进程,并开始运行一个主线程。默认情况下,同一应用程序的所有组件都在同一进程的主线程中运行。如果应用程序组件启动,并且已经存在该应用程序的进程(因为应用程序中的其它组件已经启动),则组件将在该进程中启动,并使用相同的主线程。但是,您可以通过设置让应用程序中的不同组件分别在不同的进程中运行,并且可以为任何进程创建其它线程。本文档讨论了进程和线程是如何在Android应用程序中工作的。
    Processes

    默认情况下,同一应用程序的所有组件都运行在同一进程中,大多数应用程序不需要改变此设置。但是,如果您需要设置某个组件到特定进程,则可以在manifest文件中来实现。

    每种组件元素(activity、service、receiver和 provider)都支持android:process属性,用于指定该组件运行在哪个进程中。您可以设置此属性,使每个组件在自己的进程中运行,或者某些组件共享进程,而其他组件不共享进程。您还可以设置android:process,以便不同应用程序的组件在同一进程中运行,前提是应用程序共享相同的Linuxuser ID,并使用相同的证书进行签名。元素也支持android:process属性,用于设置适用于所有组件的默认值。

    当内存不足时,Android系统可能会在某个时刻kill进程,以保证其他更直接为用户服务的进程能正常运行。在被kill的进程中运行的应用程序组件因此被销毁。当组件再次工作时,将再次启动新的进程。

    Android系统会权衡进程相对于用户的重要性来决定要杀死哪些进程。例如,与屏幕上可见Activity的进程相比,它更容易关闭在屏幕上不再可见的Activity的进程。因此,是否终止进程取决于运行在该进程中的组件的状态。更多关于进程生命周期与APP状态关系的讲解,请见Processes and Application Lifecycle。
    线程

    当应用程序启动时,系统为应用程序创建主线程。此线程非常重要,因为它负责将事件分派到的widgets。应用程序与UI组件交换也主要在主线程中进行,所以主线程也叫UI线程。然而,在特殊情况下,应用程序的主线程可能不是它的UI线程;有关更多信息,请参见 Thread annotations。

    系统不为组件的每个实例创建单独的线程。运行在同一进程中的所有组件都在该进程的UI线程中实例化,系统从UI线程发出对每个组件的调用。因此,响应系统的回调函数(如onkeydown()或onCreate())始终运行在进程的UI线程。例如,当用户触摸屏幕上的某个按钮时,应用程序的UI线程将触摸事件分发给UI控件,后者依次设置其按下状态,并向事件队列发送无效请求。UI线程取出请求并通知UI控件重新绘制。

    如果在UI线程中做所有事情,那么执行诸如网络访问或数据库查询之类的耗时操作将阻塞整个UI。当线程被阻塞时,就不能发送任何事件,包括绘制事件。从用户的角度来看,应用程序就会出现卡顿。更糟糕的是,如果UI线程被阻塞超过几秒钟(现在大约是5秒),系统就会向用户弹出“应用程序没有响应”(ANR)的对话框。然后,用户可能会退出应用程序,甚至卸载它。

    另外,安卓UI toolkit不是线程安全的。因此,您不能从工作线程操作您的UI,您必须从UI线程对用户界面进行操作。因此,Android的单线程模型有两条规则:
    1、不要阻塞UI线程
    2、不要在非UI线程中操作UI控件。
    工作线程

    由于上面描述的单线程模型,不阻塞UI线程对应用程序的响应性至关重要。如果要执行的操作不是瞬时的,则应该确保在单独的线程(“后台线程”或“工作线程”)中执行它们。但是,请注意,您不能从UI线程或“主线程”以外的任何线程更新UI。为了解决这个问题,Android提供了下面几种从其他线程访问UI线程的方法:

    Activity.runOnUiThread(Runnable)
    View.post(Runnable)
    View.postDelayed(Runnable, long)
    
    public void onClick(View v) {
        new Thread(new Runnable() {
            public void run() {
                // a potentially  time consuming task
                final Bitmap bitmap =
                        processBitMap("image.png");
                mImageView.post(new Runnable() {
                    public void run() {
                        mImageView.setImageBitmap(bitmap);
                    }
                });
            }
        }).start();
    }
    

    这个实现是线程安全的:后台操作在一个单独的线程中,而ImageView总是操纵UI线程。

    然而,随着操作复杂度的增加,这种代码会变得复杂和难以维护。为了处理UI线程与工作线程更复杂的交互,您可以考虑在工作线程中使用Handler来处理从UI线程传递的消息。或者用AsyncTask,实现后台工作任务,且更新UI。
    使用AsyncTask

    AsyncTask允许你在用户界面上执行异步操作。它在工作线程中执行耗时操作,然后更新UI,而不需要您自己处理线程或Handler。你必须扩展AsyncTask并且实现doInBackground()回调方法,它启动的线程会运行在后台线程池。如果要更新UI,你应该实现onPostExecute()。它会获取从doInBackground()返回的结果,并在UI线程中更新UI。然后可以在UI线程中调用execute()运行任务。更多关于AsyncTask的资料请参考 AsyncTask。
    线程安全的方法

    在某些情况下,您实现的方法可能会从多个线程调用,因此必须编写为线程安全的。有些方法是可以远程调用的,如bound service中的方法。当在IBinder运行的进程中调用IBinder实现的方法,那么方法是在调用者的线程中执行。但是,当在其它进程中调用IBinder实现的方法,那么方法运行所在的线程是由系统维护的一个线程池创建,并且与IBinder在同一进程。例如,Service的onBind()方法是从Service的UI线程调用的,onBind()返回的对象中的方法是在是从线程池创建的线程调用的。因为服务可以有多个客户端,多个线程可以同时使用同一个IBinder方法,因此IBinder方法必须被实现为线程安全的。

    类似地,content provider可以接收来自其他进程的数据请求。虽然ContentResolver和ContentProvider类隐藏了他们是怎样管理进程间通信的,ContentProvider中的query(), insert(), delete(), update(), 和getType()等方法是从content provider所在进程的线程池调用的。因为这些方法可以同时从任意数量的线程中调用,所以它们也必须实现为线程安全的。
    进程间通信

    Android使用远程过程调用(RPC)提供了一种进程间通信机制(IPC),Activity或其它应用程序组件调用方法,但是在另一个进程中执行,执行完后返回结果给调用者。这就需要分解方法和数据,使操作系统能理解,并将它从本地进程和地址空间传递到远程进程和地址空间,然后重新组装和调用。返回值然后以相反的方向传输。Android提供了实现IPC的所有代码,因此您可以将重点放在定义和实现RPC编程接口上。要执行IPC,你的应用必须使用bindService()绑定到一个服务,使用bindservice(),有关更多信息,请参见 Services开发指南。

    展开全文
  • 进程(process)和线程(thread)是操作系统的基本概念,但是...vs 线程 :一个进程可以包含多个线程" title="进程 vs 线程 :一个进程可以包含多个线程" style="border:0px; max-width:602px; height:auto; ma
  • 默认情况下linux环境下一个进程最多能有多少个线程?: 主线程+自己的线程382 = 383 这我自己已经验证过,测试程序在后面。
  • 一个进程能运行多少线程

    千次阅读 2019-04-11 15:22:41
    也知道线程的概念,它是程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程中有多个线程。(一个cpu内核只能运行一个进程/线程,一台8核cpu的服务器只能同时运行8个进程/线程。只是每个进...
  • 在平时工作中,经常会听到应用程序进程线程的... 线程是指进程内的一个执行单元,也是进程内的可调度实体. 线程是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位线程自己基本上不拥有系统资源...
  • 程序进程线程的区别和联系

    万次阅读 多人点赞 2018-08-26 22:27:18
    进程和程序区别和联系表现在以下方面: 1)程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。而进程则不同,它是程序在...2)进程和程序并不是一一对应的,一个程序执行在不同的数据集上...
  • Linux查看一个进程线程详情

    千次阅读 2016-12-16 11:26:50
    Linux 查看一个进程线程的状态 方法:PS 在ps命令中,“-T”选项可以开启线程查看。下面的命令列出了由进程号为的进程创建的所有线程。 1.$ ps -T -p 方法二: Top 1.$ top -H 2...
  • Linux下一个进程究竟会有多少个线程

    千次阅读 2017-10-10 14:53:46
    进程下可以启动最大线程个
  • 一个进程最多创建多少个线程

    千次阅读 2018-10-10 23:02:38
    最近,在做一个关于聊天服务器的项目,其中遇到了一个问题,那就是一个进程可以产生多少个线程呢? 开始各种想象,会和不同平台,不同系统相关,网上很多大佬说是1024个,也有256个。 与其无端猜测,不如动手测试...
  • 简单复习一下:一个”进程“代表中计算机中实际跑起来的一个程序,在现代操作系统的保护模式下,每个进程拥有自己独立的进程地址空间和上下文堆栈。但是就一个程序本身执行的操作来说,进程其实什么也不做(不执行...
  • 今天看见一个不错的话题:Java程序启动时至少会启动多少个线程? 刚看到这个话题时,我脑子里首先想到是两个,一个是main线程,一个GC回收的线程。我估计大部分人首先想到的也是两个。 其实这么想是没错的,因为它...
  • 操作系统面试之——程序进程线程 题注:《面试宝典》操作系统部分错误、漏洞较多,笔者对此参考相关书籍和自己观点进行了重写,供大家参考。 程序进程线程 1.程序进程. 进程由两部分组成:1)...
  • 一个应用程序有多少个进程

    千次阅读 2019-12-16 21:55:42
    一个程序几个进程在于这个程序的开发者的设置,可以是1个,也可以是多个的。 1.一个程序里有很多个进程 一个程序几个进程在于这个程序的开发者的设置,可以是1个,也可以是多个的。一个应用程序,启动多个处理进程...
  • Linux 中统计一个进程线程

    万次阅读 2017-03-16 16:28:08
    如果你想看到 Linux 中每个进程线程数,有以下种方法可以做到这一点。   方法: /proc proc 伪文件系统,它驻留在 /proc 目录,这是最简单的方法来查看任何活动进程的线程数。 /proc 目录以可读文本...
  • 一个进程可以创建多少线程

    千次阅读 2018-07-18 23:10:23
    理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上最多只能创建2048个线程。如果要创建多于2048的话,必须修改编译器的设置。 #include<windows.h> #include<...
  • 线程程序与单进程程序的架构

    千次阅读 2012-06-13 21:39:54
    一般采取线程池的策略,一个主线程来分配请求。 (一)常见的进程模型: (1)多线程模型 这种模式固定线程数量,吞吐量是接近每个线程的吞吐量*线程数。不具有伸缩性,伸缩性不强,在高负...
  • 一个正在执行的程序的实例 担当分配系统资源的实体(cpu时间,内存) 进程信息被放在一进程控制块的数据结构中,这个进程控制块称为PCB,进程控制块的数据结构叫task_struct  这个task_struct 包括以下几个...
  • 一个故事讲完进程线程和协程

    千次阅读 多人点赞 2018-05-28 08:29:27
    一个故事讲完进程线程和协程很久以前,有两个程序,暂且称他们旺财和小强吧。旺财和小强这两个程序都很长,每个都有十万行。 他们两个的人生价值就是到CPU上去运行,把运行结果告诉人类。CPU是稀缺资源,只有...
  • 程序进程线程的区别与联系

    千次阅读 2018-05-18 03:01:21
    借鉴了各大网站,总结出的个人... 程序(这里和前边指的是包含了线程进程程序的抽象概念)有顺序执行(顺序性,只有前操作结束后才能执行后续操作;封闭性,程序一旦运行,其执行结果不受外界因素的影响;可...
  • 一个任务既可以是一个进程,也可以是一个线程。简而言之,它指的是一系列共同达到某一目的的操作。例如,读取数据并将数据放入内存中。这个任务可以作为一个进程来实现,也可以作为一个线程(或作为一个中断任务)来实现...
  • windows 下一个进程能开多少个线程

    千次阅读 2015-08-12 17:39:19
    进程里面创建线程数收到总线的...当设置为512k时,可以开2244个线程,设置为256k时,可以开3122个线程,所以在我们做sock通信服务器时,需要注意,如果一个客户端 connect进来,就用一个线程对它进程处理的话,服务端
  • 也知道线程的概念,它是程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程中有多个线程。 既然如此,我们可以想象,一个系统中的进程数量肯定是有上限的,不然系统资源就会不够用了,同样的道理,一...
  • 一个进程最多能包含多少线程

    万次阅读 2012-10-20 16:22:34
    实验蛮简单的,但是,我不由想到了,一个进程最多能包含多少个线程。 在网上查了查,貌似也没找到多少这方面的资料。大部分都是关于服务器多线程链接sever的,关于本机可执行exe的进程数倒是没有什么涉及。 我觉得...
  • 线程:程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程中有多个线程。 既然如此,我们可以想象,一个系统中的进程数量肯定是有上限的,不然系统资源就会不够用了,同样的道理,一个进程中的线程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 412,608
精华内容 165,043
关键字:

一个程序几个进程几个线程