2015.6.10(java并发)

今天复习熟悉了Java并发的一些概念。

程序:系统要完成的一个任务,就是一个程序;

进程:每个运行中的程序就是一个进程,Windows任务管理器上可以看到每一个进程,Linux下使用ps –e命令可以查看当前运行的所有进程;

线程:每个运行的程序(进程)内部可能会包含多个顺序执行流,每个执行流就可以看做线程。

1. 进程的特性:

1) 独立性:进程是系统中独立存在的实体,它可以拥有自己独立的资源,每个进程都拥有自己私有的地址空间,其他进程不能访问这个进程空间内的数据。

2) 动态性:进程与程序的区别在于,程序是静态的,进程是动态的,程序只是一个静态的指令集合,而进程是一个正在系统中运行的指令集合,有生命周期等时间概念;

3) 并发性:进程之间,可以交替执行,提高程序执行效率。

2. 线程是一个顺序执行流,它是进程的组成部分,一个进程可以有多个线程,线程的特点如下:

1) 进程之间不能共享内存,但线程可以共享同一片内存中的数据;

2) 系统创建进程需要为该进程重新分配系统资源,但创建线程的代价很小,因此用多线程实现多任务并发比多进程实现并发的效率高;

3) java语言内置多线程功能支持,而不是单纯的作为底层操作系统的调度方式,Java封装了操作系统底层的调度,屏蔽了不同操作系统调度之间的差异。、

3. 守护线程:

守护线程是指用户程序在运行的时后台提供的一种通用服务的线程,比如用于垃圾回收的垃圾回收线程。这类线程并不是用户线程不可或缺的部分,只是用于提供服务的”服务线程”。基于这个特点,当虚拟机中的用户线程全部退出运行时,守护线程没有服务的对象后,JVM也就退出了。JDK源码中是这样解释守护线程的:

* Marks this thread as either a {@linkplain #isDaemon daemon} thread or a user thread. The Java Virtual Machine exits when the only threads running are all daemon threads.

4. 线程的创建方法

有两种创建线程的方法:一是实现Runnable接口,然后将它传递给Thread的构造函数,创建一个Thread对象;二是直接继承Thread类。

5. 线程的生命周期

当我们在Java程序中新建一个线程时,它的状态是New。当我们调用线程的start()方法时,状态被改变为Runnable。线程调度器会为Runnable线程池中的线程分配CPU时间并将它们的状态改变为Running,其他的线程状态还有Waiting(休眠时),Blocked(系统调用阻塞式IO方法时)和Dead(run或call执行结束、抛出异常等)。

6. 线程优先级

每一个线程都有优先级,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级。但Win7系统的优先级只有7个级别,并不是和Java中的优先级一一对应的,因此,Windows下的Java程序一般只使用MAX_PRIORITY、NORM_PRIORITY和MIN_PRIORITY三种级别的优先级。

7. 线程调度器(Thread Scheduler)和时间分片(Time Slicing )

线程调度器是一个操作系统服务,它负责为Runnable状态的线程分配CPU时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。时间分片是指将可用的CPU时间分配给可用的Runnable线程的过程。分配CPU时间可以基于线程优先级或者线程等待的时间。线程调度并不受到Java虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优先级)。

小感:

想到了在学校做的一个功能,用Websocket实现的网页即时通讯,其实,服务器接收客户端消息,转发消息,存储消息就可以用多线程技术实现来提高效率。客户端发来的消息在后台用Map对象存储,开辟多个线程,一个线程用以保存数据到Map对象,一个用以转发消息给在线的用户,一个用以在空闲时将数据持久化存储到数据库,一个用以监听客户端发送过来的消息,这样就能大大提高消息的转发、存储效率。当然,这里面可能牵涉到对Map对象的读写分离,可以用锁机制来保证读写一致性(下次详细探讨下Java并发中锁的实现)。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-15 22:25:42

2015.6.10(java并发)的相关文章

java并发编程10.构建自定义的同步工具

创建状态依赖类的最简单方法通常是在类库中现有状态依赖类的基础上进行构造.如果类库中没有提供你需要的功能,可以使用java语言和类库提供的底层机制来构造自己的同步机制,包括内置的条件队列.显示地Condition对象以及AbstractQueuedSynchronizer框架. 在单线程程序中调用方法时,如果基于某个状态的前提条件未得到满足,那么这个条件永远无法成真.而在并发程序中,基于状态的条件可能会由于其他线程的操作而改变. 可阻塞的状态依赖操作 acquire lock on object

Java并发(10)- 简单聊聊JDK中的七大阻塞队列

引言 JDK中除了上文提到的各种并发容器,还提供了丰富的阻塞队列.阻塞队列统一实现了BlockingQueue接口,BlockingQueue接口在java.util包Queue接口的基础上提供了put(e)以及take()两个阻塞方法.他的主要使用场景就是多线程下的生产者消费者模式,生产者线程通过put(e)方法将生产元素,消费者线程通过take()消费元素.除了阻塞功能,BlockingQueue接口还定义了定时的offer以及poll,以及一次性移除方法drainTo. //插入元素,队列

Java并发安全部分知识点总结 —— 8月20日学习分享

非常感谢洋哥的本周知识分享,灰常精辟-!洋哥的知识串起来了线程安全的大部分知识,我也根据我的知识储备及网络搜寻,整理了一份我自己当前的理解. 一. 线程安全性的知识准备 1.1 知识准备a:JVM 内存模型 与 线程安全 线程安全,就是通过多个线程对某个资源进行有序访问或者修改,这里的某项资源对应的底层即是一个个的 JVM 内存模型. 所以,针对 线程安全 来谈的 JVM 内存模型,想要实现线程安全,那么就要实现两点:可见性及有序性,前者保证某项线程修改某共享变量之后可以被其它线程感知,后者保证

Java并发编程原理与实战四十五:问题定位总结

背景   “线下没问题的”. “代码不可能有问题 是系统原因”.“能在线上远程debug么”    线上问题不同于开发期间的bug,与运行时环境.压力.并发情况.具体的业务相关.对于线上的问题利用线上环境可用的工具,收集必要信息 对定位问题十分重要.    对于导致问题的bug.资源瓶颈很难直观取得数据,需要根据资源使用数据.日志等信息推测问题根源.并且疑难问题的定位通常需要使用不同的方法追根溯源.    这篇wiki我对自己使用过的工具做了整理,并分享一些案例. 1.  常见问题1.1 可用性

Java并发编程:Concurrent锁机制解析

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

Java并发编程:Callable、Future和FutureTask(转)

Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 今天我们就来讨论一下Callabl

6、Java并发编程:volatile关键字解析

Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatil

7、Java并发编程:深入剖析ThreadLocal

Java并发编程:深入剖析ThreadLocal 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景. 以下是本文目录大纲: 一.对ThreadLocal的理解 二.深入解析ThreadLocal类 三.ThreadLocal的应用场景 若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者

JAVA并发总结-基础篇

多线程 1. java中有几种方法可以实现一个线程? 继承Thread类,实现Runnable接口创建一个线程的唯一方法是实例化java.lang.Thread类(或其子类),并调用其start()方法 2. 如何停止一个正在运行的线程? 调用ThreadInstanceA.inerrupt()方法,这样当A线程在Thread的sleep,join方法,或者Object的wait方法的时候会直接抛出InerruptedException,捕捉后便可退出. public void shutdown