Java并发库简介

标签: java  并发库简介 多线程简介
7人阅读 评论(0) 收藏 举报
分类:

1.传统线程创建方式

       集成Thread类,重写run方法;实现Runnable接口,重写run方法,并把Runnable的接口实现传给Thread。

2.线程互斥技术----synchronized

    synchronized可用于方法和代码块中,在多个线程处理同一数据源时,防止出现并发问题。

            public synchronized void Method1(){ ...... }

            synchronized (Object o){ ...... }

3.ThreadLocal处理线程间共享数据

    该类提供了线程局部 (thread-local) 变量。访问某个变量(通过其 getset 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。类似于map集合,只是这里不需要指定key值,这里的key值默认为当前线程。

    ThreadLocal<T> threadLocal = new ThreadLocal<T>();

    threadLocal.set(new T());

    T t = threadLocal.get();

4.线程池Executors

    Executors用于创建线程池,常用的静态方法:
        

newFixedThreadPool(int nThreads)创建固定数量的线程池
newCachedThreadPool()创建缓存的线程池
newSingleThreadExecutor()创建单个线程
  

返回值类型均为ExecutorService

ExecutorService service = Exrcutors.newFixedThreadPllo(5);  创建五个线程

service.execute(new Runnable(){...});  执行线程任务

5.Callable接口

  Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。而Callable可以返回一个结果,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值 .

    实现Callable<T>接口需要重写call方法。

ExecutorService service = Exrcutors.newSingleThreadExecutor();  创建一个线程

Futrue<T> future = service.submit( new Callable<T>(){ public T call(){ ......} );  执行线程任务

如果多个线程执行Callable任务,返回多个Future,需要借助CompletionService<T>接口

    ExecutorService service = Exrcutors.newFixedThreadPllo(5);  创建五个线程

    CompletionService<T> completionService = new ExecutorCompletionService<T>(service); 将线程池放进去

completionService.summit(new Callable(){......}); 执行线程任务

   Future<T> future = completionService.take();获取并移除表示下一个已完成任务的 Future,

                                               如果目前不存在这样的任务,则等待

    future.get();

关于Future:

Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。

计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。

还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。

6.线程锁Lock

    Lock功能与synchronized类似,使用简单。

    Lock lock = new ReentrantLock();

    lock.lock();

    lock.unLock();

7.读写锁ReadWriteLock

锁又分为读锁和写锁,读锁与读锁不互斥,读锁与写锁互斥,写锁与写锁互斥,这是由jvm自己控制的

ReadWriteLock rwk = new ReentrantReadWriteLock();

读锁:rwk.readLock().lock();

     rwk.readLock().unlock();

写锁:rwk.writeLock().lock();

     rwk.writeLock().unlock();

8.Condition条件阻塞

    Conditon可以用来替换传统的wait() 和 notify() 方法;

    Condition必须和Lock一起使用,没有Lock就没法使用Condition.

        Lock lock = new ReentrantLock();

        Condition condition = lock.newCondition();

        lock.lock(); ...... condition.await(); ......condition.signal();//唤醒某一个线程

9.Semaphore线程同步工具

    Semaphore通常用于限制访问某些资源的线程数,但是并未实现线程同步问题。常用方法acquire、release,用户获取和释放线程资源。

        ExecutorService service = Executors.newCachedThreadPool();//使用并发库,创建缓存的线程池  

        Semaphore sp = new Semaphore(3);//创建一个Semaphore信号量,并设置最大并发数为3

               new Thread(new Runnable() {

                                    public void run(){ .... sp.acquire(); ...... sp.release()});

10.CyclicBarrier线程同步工具

        CyclicBarrier可以使不同的线程彼此等待,等这些不同的线程都执行完了,再执行下面的程序。一般用于主任务执行需要所有的子任务执行完毕的功能需求中。

        ExecutorService service = Executors.newCachedThreadPool();

    CyclicBarrier cb = new CyclicBarrier(2);//设置2个等待线程,2个线程都执行完,再执行后面的程序。

    new Runnable(){

        public void run(){ runnable1; cb.await(); runnable2; cb.await(); };

11.Exchanger线程同步工具

        Exchanger只能用于两个线程之间交换数据,如果是多个线程运行,一次也只能在两个线程间交换数据。

        只有当每个线程都在进入 exchange ()方法并给出对象时,才能接受其他线程返回时给出的对象。







查看评论

第1周:机器学习简介-人工智能工程师直通车

本课程共分为三个阶段。从机器学习到深度学习,再到项目实战,循序渐进,层层深入。除了系统讲解成为一名人工智能工程师所需的理论知识外,每节课还会配有实战案例,通过练习巩固所学知识,学以致用解决实际问题。第三个阶段包含四个大型工业级综合实战案例,采用大量真实数据集,完美模拟工作场景。学完后,大家绝对可以胜任人工智能领域相关工作。
  • 2018年01月19日 18:15

Java并发编程实战--简介

 Java并发编程实战--简介       导读:在Java编程中,编写正确的并发编程本身就是一件难事,与串行程序相比,并发程序很容易出错。在Java中如何编写Java并行的编程呢--线程。线程可以使...
  • mcb520wf
  • mcb520wf
  • 2018-04-07 11:57:38
  • 24

Java中的并发库学习总结

我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便。而当针对高质量Java...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014-03-03 15:12:04
  • 12131

经典Java多线程与并发库高级应用

  • 2018年02月15日 00:24
  • 580KB
  • 下载

【java并发】线程并发库的使用

1. 线程池的概念  在java5之后,就有了线程池的功能了,在介绍线程池之前,先来简单看一下线程池的概念。假设我开了家咨询公司,那么每天会有很多人过来咨询问题,如果我一个个接待的话,必然有很多人要排...
  • eson_15
  • eson_15
  • 2016-06-02 21:15:09
  • 6272

张孝祥_Java多线程与并发库高级应用02

03. 传统线程互斥技术        线程安全问题例子:银行转账        同一个账户一边进行出账操作(自己交学费),另一边进行入账操作(别人给自己付款),线程不同步带来的安全问题 示例:...
  • zengquan2014
  • zengquan2014
  • 2015-11-22 22:47:40
  • 529

笔记_张孝祥_Java多线程与并发库高级应用

  • 2016年03月28日 20:17
  • 577KB
  • 下载

视频专辑:张孝祥 Java多线程与并发库高级应用

简介:Java线程是一项非常基本和重要的技术,在偏底层和偏技术的Java程序中不可避免地要使用到Java线程技术,特别是android手机程序和游戏开发中,多线程成了必不可少的一项重要技术。但是,很多...
  • likun557
  • likun557
  • 2013-11-25 11:09:23
  • 1706

java并发编程实战-----简介

1、并发和并行的区别并发:多个程序在同一时间段运行,只有一个CPU。并行:多个程序在同一时刻运行,有多个CPU。2、线程带来的风险(1)安全性问题:“永远不发生糟糕的事情”,两个或多个线程同时访问一个...
  • g1607058603
  • g1607058603
  • 2018-03-05 20:01:42
  • 9

Java面向对象——JDK 1.5 线程并发库

面向对象 JDK 1.5新特效性 线程并发库
  • u012840558
  • u012840558
  • 2014-03-28 21:57:17
  • 1294
    个人资料
    持之以恒
    等级:
    访问量: 1530
    积分: 123
    排名: 116万+
    文章存档