如何理解程序、进程、线程?

三者之间的形象化理解:
程序:代码实现了功能,就是程序,是静态的;程序是存储在磁盘上。

例如:实现eclipse的代码

进程:执行中的程序就是进程,是动态的;

例如:运行eclipse出现的界面

线程:进程内的一个执行单元,也是进程内的可调度实体,可以并发执行提高了进程的效率。

程序与进程的区别:
程序是指令的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
  程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。
  进程更能真实地描述并发,而程序不能;进程是由程序和数据两部分组成的。
  进程具有创建其他进程的功能,而程序没有。
  同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程。也就是说同一程序可以对应多个进程。

 

为什么我们要引入线程这个概念,有进程不可以处理计算机要求的任务了吗?

(1)进程只能在同一时间干一件事情,如果想同时干两件事或多件事情,进程就无能为力了。
(2)进程在执行的过程中如果由于某种原因阻塞了,例如等待输入,整个进程就会挂起,其他与输入无关的工作也必须等待输入结束后才能顺序执行。

进程和线程的区别:

线程是进程的一个实体,也是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,有时又被称为轻权进程或轻量级进程,相对进程而言,线程是一个更加接近于执行体的概念,进程在执行过程中拥有独立的内存单元,而线程自己基本上不拥有系统资源,也没有自己的地址空间,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),线程的改变只代表了 CPU 执行过程的改变,而没有发生进程所拥有的资源变化。除了CPU 之外,计算机内的软硬件资源的分配与线程无关,但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

进程和线程的主要差别在于操作系统并没有将多个线程看作多个独立的应用,来实现进程的调度和管理以及资源分配。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些,对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程,每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

Java实现线程的方式有哪些?
    Runnable    接口
        run()    线程的运行方法    
        把Runnable接口的对象转换为Thread类的对象。
    Thread        类,是Runnable接口的子类
        run()    线程的运行方法    
        start()    线程的启动方法
        sleep(long time)    线程的休眠方法,单位是毫秒

package thread;
/*
 * 定义Test类
 */
public class Test {

    public int i;

    public Test(int i) {
        this.i = i;
    }

}
package thread;

/*
 * 定义ThreadDemo类继承Thread类
 */
public class ThreadDemo implements Runnable { // extends Thread {

    private Test t;                             // Test类作为属性

    public ThreadDemo(Test t) {                 // 构造方法
        this.t = t;

    }

    /*
     * 重写run方法(线程运行方法)
     */
    public void run() {
        while (t.i < 20) {
            t.i++;
            System.out.println(Thread.currentThread() + "1 " + t.i);
        }
    }

    /*
     * 主函数入口
     */
    public static void main(String[] args) {
        Test test = new Test(10);                         // 实例化Test对象
        System.out.println(Thread.currentThread() + "2 " + test.i);

        for (int i = 0; i < 10; i++) {
            ThreadDemo td = new ThreadDemo(test);         // 实例化ThreadDemo类的对象
            // td.start();
            Thread thread = new Thread(td);             // 自动转换类型,td相当于Runnable子类对象
            thread.start();                             // 调用start方法
        }
        System.out.println(Thread.currentThread() + "3 " + test.i);

    }

}

 

转载自:https://blog.csdn.net/woaigaolaoshi/article/details/51039505

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进程线程都是计算机中的并发执行模型,它们的最大区别在于进程是操作系统资源分配的基本单位,而线程程序执行的基本单位。下面是它们的优缺点和使用场景: 进程的优点: 1. 进程之间互相隔离,相互之间不会影响; 2. 进程之间共享数据简单,可以使用IPC机制进行通信; 3. 进程可以利用多核CPU进行并发执行; 4. 进程崩溃不会影响其它进程进程的缺点: 1. 进程创建、切换和销毁的开销比较大; 2. 进程之间的通信比较耗时; 3. 操作系统需要为每个进程分配独立的内存空间,占用较多的内存资源。 线程的优点: 1. 线程创建、切换和销毁的开销比进程小很多; 2. 线程之间的通信比进程之间的通信更加快速和简便; 3. 多线程可以充分利用CPU的多核特性,提高程序的并发执行能力; 4. 线程之间共享内存,数据共享简单。 线程的缺点: 1. 线程之间没有隔离,一个线程崩溃可能会影响整个程序; 2. 线程之间的共享数据容易引起数据竞争; 3. 线程的数量过多会影响程序的性能。 使用场景: 一般来说,进程适用于需要隔离的场景,比如操作系统的进程管理、Web服务器的多进程模型等;线程适用于需要并发、数据共享的场景,比如图形界面程序、网络服务器的多线程模型等。在实际应用中,根据具体的需求和应用场景来选择合适的并发执行模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值