• java 进程和线程


    什么是进程,什么是线程?
    进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。

    线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。

    一个程序至少一个进程,一个进程至少一个线程。

    进程线程的区别:
    1、地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。

    2、资源拥有:同一进程内的线程共享本进程的资源,但是进程之间的资源是独立的。

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

    4、进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。

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

    6、线程是处理器调度的基本单位,但是进程不是。

    7、两者均可并发执行。

    优缺点:
    线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。

    进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。

    什么地方会用到多线程?
    1、后台线程:比如定期执行一些特殊任务,如定期更新配置文件,任务调度,一些监控用于定期信息采集等。

    2、最典型的应用比如tomcat,tomcat内部采用的就是多线程,上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程序,比如doGet或者doPost方法。还有就是需要异步处理的时候,需要使用多线程。

    3、特别耗时的操作,如备份数据库,可以开个线程执行备份,然后执行返回,前台不断向后台询问线程执行状态。

    多线程有几种实现方法?有什么区别?
    实现多线程有两种方式:(自JDK1.5之后有三种,最后一种并不常用)

       1.继承Thread类

       2.实现Runnable接口(Callable接口)

    一个类如果实现了Runnable接口或者继承了Thread类,那么它就是一个多线程类,如果是要实现多线程,还需要重写run()方法,所以run() 方法是多线程的入口。

    多线程的两种实现方式的区别:

       1.Thread是Runnable接口的子类,实现Runnable接口的方式解决了Java单继承的局限

       2.Runnable接口实现多线程比继承Thread类更加能描述数据共享的概念

    多线程有几种实现同步方法?
    同步的实现方面有两种,分别是synchronized,wait与notify

    wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

    sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

    notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

    Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

    产生死锁的原因?
    产生死锁的四个必要条件:

    1、互斥条件:一个资源每次只能被一个进程使用。

    2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

    3、不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

    4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

    避免死锁
    上面列出了死锁的四个必要条件,我们只要想办法破其中的任意一个或多个条件,就可以避免死锁发生,一般有以下几种方法:

    1、按同一顺序访问对象。

    2、避免事务中的用户交互。

    3、保持事务简短并处于一个批处理中。

    4、使用较低的隔离级别。

    5、使用基于行版本控制的隔离级别。

    6、使用绑定连接。

    以上就是有关进程和线程的总结,有什么好的意见欢迎大家留言。

  • 相关阅读:
    将jar包安装到本地repository中,---以greenplum.jar举例
    推荐系统学习起步
    代理模式详解:静态代理、JDK动态代理与Cglib动态代理
    MyBatis(四):自定义持久层框架优化
    MyBatis(二):自定义持久层框架思路分析
    MyBatis(一):JDBC使用存在的问题
    PHP编程趣事:能喝几瓶啤酒?
    Linux下的两个经典宏定义
    C/C++中常用的字符串处理函数和内存字符串函数
    设计模式之适配器模式(Adapter Pattern)C++实现
  • 原文地址:https://www.cnblogs.com/hewanli/p/12326300.html
Copyright © 2020-2023  润新知