Category Archives: java多线程

Java并发编程:线程池的简单介绍

前言 Java从JDK1.5引入了java.uitl.concurrent包,在这个包中包含了一个Executor Framework,有关线程池的操作就位于该框架中。在没有引入线程池之前,在实际开发中为了提高系统性能会为每一个任务分配一个线程,实际上这种处理方式存在很大缺陷,尤其是在需要创建大量线程时。 线程生命周期的开销非常高。每一个线程在创建的时候都需要时间,并且需要JVM和操作系统提供一些 […]

阅读更多 »

Java并发编程:显式锁Lock

Lock显式锁是在JDK1.5引入的,在JDK1.5之前处理多线程并发使用的是synchronized和volatile关键字。在JDK1.5之后增加了一种新的机制Lock,虽然与synchronized类似都是提供加锁机制,但是Lock锁并不是提供了一种替代内置锁synchronized的方式,而是当内置锁机制不适用时,提供了一种可选择的更高级的功能。 synchronized的局限性 sync […]

阅读更多 »

Java并发编程:阻塞队列BlockingQueue

阻塞队列BlockingQueue简介 阻塞队列BlockingQueue是JDK1.5并发新特性中的内容,阻塞队列首先是一个队列,同样实现了Collection接口。阻塞队列提供了可阻塞的put和take方法,以及支持定时的poll和offer方法。 阻塞队列跟普通队列相比,首页它是线程安全的,另外还提供了两个附加操作:当队列为空时,从队列中获取元素的操作将被阻塞;当队列填满是,向队列添加元素将 […]

阅读更多 »

Java并发编程:volatile关键字的使用

volatile也是实现多线程并发编程常用的关键字,但是在使用频率上面不如加锁机制。实际上volatile和加锁是Java语言内在的两种同步机制,只是volatile关键字修饰的变量同步性稍差一些。 Java语言规范第三版中对volatile的定义如下: Java语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排它锁单独获得这个变量。Java语言提供了volatil […]

阅读更多 »

Java 如何停止一个线程

在Java中如何才能正在启动一个线程Thread,实际上使用的是线程Thread的start()方法。但是如何停止一个正在运行的线程呢?线程Thread类提供了stop()方法,可是实际开发中几乎没有使用过线程Thread自己提供的stop()方法,因为stop()方法从JDK1.2开始就已经Deprecated,下面是JDK中对stop()方法的描述。 该方法具有固有的不安全性。用 Thread […]

阅读更多 »

Java 多线程之Callable、Future以及FutureTask

在以前的文章中介绍过创建线程的两种方式:一种直接继承Thread类,另外一种就是实现Runnable接口。这两种方式也是从接触Java以来接触到的最常见的创建线程的方式,但是这两种方式创建线程都有一个缺陷:在执行时完成后无法返回执行结果,就是没有返回值,这也是最致命的缺陷。如果真的需要执行结果,一般情况下或者使用一个共享变量或者线程间通信,使用相当麻烦。除此之外,创建的线程无法抛出任何的异常。 从 […]

阅读更多 »

浅谈对synchronized的理解

引言 在并发编程中,经常遇到多个线程访问同一个共享资源,这时候作为开发者必须考虑如何维护数据一致性,在java中synchronized关键字被常用于维护数据一致性。synchronized机制是给共享资源上锁,只有拿到锁的线程才可以访问共享资源,这样就可以强制使得对共享资源的访问都是顺序的,因为对于共享资源属性访问是必要也是必须的,下文会有具体示例演示。 java中的锁 一般在java中所说的锁 […]

阅读更多 »

java线程中的run和start方法

刚开始接触线程的时候,只是生硬的记住了如果要启动一个线程必须调用该线程的start方法,可是由于刚开始不经常使用多线程方面的知识,所以渐渐的就模糊了,现在常常碰到多线程的使用,知其然知其所以然嘛,今天就从源码方面探究一下。 run方法 查看一下JDK的源码,可以看到Thread中的run方法调用的是Runnable中run:

Thr […]

阅读更多 »