zoukankan      html  css  js  c++  java
  • JAVA线程和进程区别

    1,JAVA线程和进程区别?

    (1)简单来讲一个运行的程序就是一个进程,一个进程中可以有多个线程(线程是程序执行的最小单元)。

    (2)线程有四种状态:运行,就绪,挂起,结束

    (3)使用多线程的好处

      •  使用线程可以增强交互性。使用线程就可以异步 的反方式执行代码。通俗来讲,如果在代码中有一段代码较为耗时,或者需要等待某种条件,如果使用进程,该段代码下面的代码就必须等待该段代码执行完之后才能运行,同时用户鼠标键盘的操作,计算机也不会理会,从来影响交互性。但是如果把耗时的操作放在线程中,他就会独立的运行,线程外的代码就不用等待它运行结束。
      • 减少开销。开启一个线程,就必须给它分配内存空间,如果将多个线程放在同一个进程中,那么这些线程是资源共享的,主要是堆内存中资源,但是栈是一个进程所私有的,不被共享。
      • 现在很多的计算机都是多CPU多内核的。只有在多线程的情况下,他们才能发挥作用,如果使用单线程,就是一种资源的浪费
      • 使用多线程可以简化开发,将可以异步执行的代码分离出来,放在run()方法中,使代码不至于太过复杂,跟容易阅读理解。

    2,创建线程的方式?

    创建线程有三种方式

    (1)通过继承Thread类,重写run()方法

    (2)通过实现Runable接口,重写run()方法

    (3)通过实现Callable接口,重写call()方法

    3,第一种方式与第二种方式的比较?

    第一种方法是通过继承来实现,第二种是通过实现接口。

    (1)Thread类中有多个方法需要被重写,但是只有run()需要被重写;实现Runable方法的话就只需要重写run()即可

    (2)适应继承的原则就是只有两个类是is-a的关系时才可以使用继承,java中的继承只能是单继承,继承具有局限性。

    4,第三种方式的有特点

    (1)前两种方式都是没有返回值的,只有第三种有返回值

    (2)适应Callable可以拿到一个Future对象,Future对象表示异步计算的结果,它提供了检查计算是否完成的方法。由于线程属于异步计算模型,因此无法从别的线程中获取结果,在这种强情况下,就可以使用Future来监视目标线程调用call()的情况

    (3)run()不可以抛出异常,call()可以抛出异常

    5,start() 与run()的区别

    (1)run方法中存放的是线程要执行的代码

    (2)start() 用于开启一个线程,执行run()方法

    (3)只有通过调用start()执行run()才会以多线程的方式执行,如果直接调用run(),就不会开启新的线程,

    run()中的将会按顺序执行。

    6,什么是同步?什么是异步?

    (1)同步,异步都是对多线程而言的

    (2)同步指的是对于临界资源,同一时刻只能被一个线程访问,也就是如果线程A在访问临界资源的时候,线程B如果也要访问这个临界资源,他只能等待线程A访问结束之后

    (3)异步指的是,线程都有自己的内存空间,具备自己运行需要的条件,无需等待其他线程的执行。也就是线程之间独立运行

    7,实现同步的方式

    (1)同步函数,在方法声明的时候加同步标识,将整个方法体视为临界资源,如果方法体过于庞大,存在很多没有必要同步的代码,就会遭成程序效率的降低,比如说hashtable的底层实现。

    (2)同步代码块,只对需要同步的部分代码设为临界资源。括号里面的内容为加锁对象。

    (3)在jdk1.5版本中出现的Lock接口的实现类ReentrantLock。

    8,传统加锁方式与Lock接口加锁的不同之处

    (1)加锁的位置不同。

    • 传统的加锁方式是在方法体或者代码块加锁
    • Lock是显示的指明加锁和释放锁的位置

    (2)锁的实现机制不同

    传统的锁是交给JVM来执行的

    Lock是自己代码的实现,有更精准的线程语义

    (3)性能不相同,在资源竞争不是很激烈的情况下,使用传统的方式性能更高;在资源竞争激烈的情况下,传统的方式性能急剧下降,Lock的方式性能不会发生改变

    9,Lock获取锁的方式

    (1)lock(),阻塞的方式获取锁,如果获取到就返回,获取不到就等待,直到获取到为止

    (2)tryLock(),非阻塞的方式获取锁,只是尝试性的获取锁,获取到就返回true,获取不到就返回false。

    (3)tryLock(long timeout,TimeUnit time),上一种方式的升级,获取到就返回true,获取不到,就等待制定的时间单元,在等待的过程中如果获取到锁,就返回true,如果超时还未获取到,就返回false

    (4)lockInterruptibly().如果获取到了锁,就返回,获取不到就休眠,直到获取到锁,或者当前线程被中断(会抛出InterruputedExceptiopn)。他与Lock()的不同之处在于,lock()一旦获取不到锁,就会一直处于阻塞状态。

    10,sleep()与wait方法的区别

    (1)原理不同,sleep()方法是Thread方法提供的静态方法,用于控制自身流程。用于暂停

  • 相关阅读:
    web.config配置错误的后果
    重装VS.NET碰到:IDE 未能加载 Dte.olb
    初次使用Wix
    typedef
    [WTL] Accelerator
    在浏览器中粘贴时替换剪贴板数据
    自定义浏览器
    关于MSHTML
    [WTL] STLport安装指南
    [WTL] WTL7.5中CFileDialog用'\0'过滤
  • 原文地址:https://www.cnblogs.com/excellencesy/p/9214379.html
Copyright © 2011-2022 走看看