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方法提供的静态方法,用于控制自身流程。用于暂停
JAVA线程和进程区别的更多相关文章
- java线程与进程
Java线程与进程 进程与线程的关系 进程里面至少有一个线程,进程间的切换会有较大的开销 线程必须依附在进程上,同一进程共享代码和数据空间 多线程的优势 多线程可以达到高效并充分利用cpu 线程使用的 ...
- Java线程和进程相关面试题与答案总结
有几天没有写一写博客了,今天就带给大家一些面试题和参考答案吧! 这些都是上海尚学堂Java培训的学员去面试时遇到的问题,今天总结出来的是Java线程相关类的面试题.把参考答案和解析也发布出来,供大家学 ...
- Java线程和进程
一.线程 1.什么是线程: 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.一个进程至少包含一个线程,也可以多个,线程属于进程. 2.Java中线程经历的四个 ...
- 菜鸡的Java笔记 第三十七 - java 线程与进程
线程与进程 线程与进程的区别 最早的的时候DOS 系统有一个特点:只要电脑有病毒,那么电脑就死机了,是因为传统的DOS 系统属于单进程的操作系统 ...
- UNIX环境高级编程——线程与进程区别
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性.进程和线程的区别在于: (1)一个程序至少有一个进程,一个进程至少有一个线程. (2)线程的划分尺度小于进 ...
- 关于java线程、进程的一些问题
1.多核硬件上,java中同一个进程的多个线程可以运行在不同的CPU上么? 应该是可以的,在eclipse上面跑一个模拟程序,一个死循环的线程可以占用系统(4核,Win7)%的CPU,4个这样的线程刚 ...
- java线程与进程的比较
线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元:而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任 ...
- java线程,进程,多线程
(1)线程和进程 通俗一点,进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行. (2)java中实现线程的两种方式,第一种是继承Thre ...
- java线程初写,陆续更新中。。
(1)什么是线程?线程,是程序执行流的最小单元.线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享 ...
随机推荐
- bzoj千题计划218:bzoj2333: [SCOI2011]棘手的操作
http://www.lydsy.com/JudgeOnline/problem.php?id=2333 上次那个是线段树,再发一个左偏树 维护两种左偏树 第一种是对每个联通块维护一个左偏树 第二种是 ...
- CS53 C 单调栈
给出一个目标序列,初始序列为0,你有一种操作方式可以将某段值相同的区间全部加上一定的值,问得到目标序列的最小次数. 开始没注意要求值相同,想都不想就暴力了,后来发现对于每个峰,只要找每个相对峰顶的阶数 ...
- 开启SSI配置使shtml支持include公用的页头页脚
编写编写项目众多静态文件时,能像php等开发语言一样使用include将页面公有的header/footer/sidebar作为公用.独立.单一的文件引入到各页面上,这样修改这些页面公用部分时就能单独 ...
- nginx配置伪静态
最近做门户网站,使用了的nginx重写规则 项目目录下写好 nginx.conf文件 然后在打开nginx配置文件,在server引入对应的重写规则的文件就可以了 当然直接写在配置里面 locatio ...
- unp学习笔记——Chapter1
1.发现网络拓扑的几个重要的命令 (1).netstat -i 提供网络接口的信息.我们还指定-n 标志以输出数值地址,而不是试图把它们反向解析成名字.netstat -r 展示路由表. dzhwen ...
- Passbook
CHENYILONG Blog Passbook 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilon ...
- [HAOI2008]移动玩具(状压&带权二分图)
题目描述 • 一个 4 × 4 的 0/1 矩阵 • 每次可以交换相邻两个元素 • 求从初始状态到目标状态的最小交换次数 输入格式 前四行,每行一个长为 4 的 0/1 字符串,描述初始状态. 后四行 ...
- [Alg::Trick]小白鼠找毒酒
题目来源:牛客网 https://www.nowcoder.com/questionTerminal/c26c4e43c77440ee9497b20118871bf1 8瓶酒一瓶有毒,用人测试.每次测 ...
- redis从入门到踩坑
背景 Redis在互联网项目的使用也是非常普遍的,作为最常用的NO-SQL数据库,对Redis的了解已经成为了后端开发的必备技能.小编对Redis的使用时间不长,但是项目中确两次踩中了Redis的坑, ...
- update-rc.d使用
在Linux系统下,一个Services的启动.停止以及重启通常是通过/etc/init.d目录下的脚本来控制的.然而,在启动或改变运行级别时,是在/etc/rcX.d中来搜索脚本.其中X是运行级别的 ...