Java 8 并发编程

Java 1.5前

并发实现

  • Java Green Thread

java 1.2 前的线程受os内核限制, 线程=进程, 绿色线程是JVM调度, 用来模拟多线程环境. 不需要本地线程支持.

  • Java Native Thread

对比
绿色线程在线程激活和线程同步方面优于本地线程
在I/O和上下文操作方面性能要低于本地线程

编程模型

  • Thread
  • Runnable

局限性(后续版本将解决完善这部分缺陷, 可对比学习)

  • 缺少线程管理的原生支持(缺少线程池)
  • 缺少"锁"API(只有 synchronized 关键字)
  • 缺少执行完成的原生支持

变通的实现方式:


public static void main(String[] args){
    CompletableRunnable runnable = new CompletableRunnable();
    Thread thread = new Thread(runnable,"Sub");
    thread.start();
    thread.join(); //此处阻塞主线程等待Sub完成, 否则得到的结果不准确
    System.out.printf("[Thread: %s] is running\n", Thread.currentThread.getName());
    System.out.printf("Sub Thread is completed, result is %s\n", runnable.getCompleted());
}

private static class CompletableRunnable implements Runnable{
    private volatile boolean completed = false;

    @Override
    public void run(){
        System.out.printf("[Thread: %s] is running\n", Thread.currentThread.getName());

        completed = true;
    }

    public boolean getCompleted(){
        return completed;
    }
}
  • 执行结果获取困难
  • Double Check Locking 不确定性 (单例模式)

Java 5

并发框架

  • J.U.C

编程模型

  • Executor, Execurtors, ExecutorService 等
  • Runnable , Callable
  • Future

Java 7

并行框架

  • Fork/Join

编程模型

  • ForkJoinPool
  • ForkJoinTask
  • RecursiveAction

Future (Java 5 引入) 限制

  • 无法手工完成
  • 阻塞式结果返回
  • 无法链式多个Future
  • 无法合并多个Future的结果
  • 缺少异常处理

Java 8

异步并行框架

  • Fork/Join

编程模型

  • CompletionStage
  • CompletableFuture

其他框架

  • Spring 和 Guava 使用不同的 ListenableFuture

原文地址:https://www.cnblogs.com/walkinhalo/p/11125719.html

时间: 2024-11-06 21:49:11

Java 8 并发编程的相关文章

对JAVA多线程 并发编程的理解

对JAVA多线程并发编程的理解 Java多线程编程关注的焦点主要是对单一资源的并发访问,本文从Java如何实现支持并发访问的角度,浅析对并发编程的理解,也算是对前段时间所学的一个总结. 线程状态转换 Java语言定义了5中线程状态,在任何一个时间点,一个线程只能有且只有其中一种状态,这5中状态分别是: ?  新建(New):创建后尚未启动的线程处于这种状态 ?  运行(Runable):Runable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在执行,也有可

《Java虚拟机并发编程》学习笔记

对<Java虚拟机并发编程>这本书真的是相见恨晚.以前对并发编程只是懂个皮毛,这本书让我对并发编程有了一个全新的认识.所以把书上的知识点做下笔记,以便以后复习使用. 并发与并行 仔细说来,并发和并行是两个不同的概念.但随着多核处理器的普及,并发程序的不同的线程往往会被编译器分配到不同处理器核心上,所以说并发编程与并行对于上层程序员来说是一样的. 并发的风险 饥饿 当一个线程等待某个需要运行时间很长或者永远无法完成的时间发发生,那么这个线程就会陷入饥饿状态.通常饥饿也会被叫做活锁. 解决饥饿的方

Java 7 并发编程实战手册目录

Java 7 并发编程实战手册目录 第一章线程管理 第二章线程同步基础 第三章线程同步辅助类 第四章线程执行器 第五章 Fork/Join框架 第六章并发集合 第七章定制并发类 第八章所有代码下载https://github.com/Wang-Jun-Chao/java-concurrency 版权声明:本文为博主原创文章,未经博主允许不得转载.

Java高并发编程(一)

1.原子量级操作(读.++操作.写分为最小的操作量单位,在多线程中进行原子量级编程保证程序可见性(有序性人为规定)) 由于某些问题在多线程条件下:产生了竞争的问题,(例如:在多线程中一个简单的计数器增加)如果在程序中不采用同步的机制,那么在程序的运行结果中,多个线程在访问此资源时候,产生Racing.解决这个问题,采用某种方式阻止其他线程在该线程使用该变量的时候使用该变量 采用原子级操作:1.采用加锁的机制(最好的操作)2.Java.concurrent.atomic包包含一些原子量操作:Ato

Java基础 &amp; 并发编程

Java基础 http://www.cnblogs.com/dolphin0520/category/361055.html Java并发编程 http://www.cnblogs.com/dolphin0520/category/602384.html

Java多线程并发编程

Thread和Runnable Runnable接口可以避免继承自Thread类的单继承的局限性. Runnable的代码可以被多个线程(Thread的实例)所共享,适合于多个线程共享资源(其实就是持有同一个runnable实例)的情况. 以火车站买票为例,分别以继承Thread类和实现Runnable接口这两种方式来模拟3个线程卖5张票: 使用Thread类模拟卖票 1 class MyThread extends Thread{ 2 3 private int ticketCount = 5

java多线程并发编程与CPU时钟分配小议

我们先来研究下JAVA的多线程的并发编程和CPU时钟振荡的关系吧 老规矩,先科普 我们的操作系统在DOS以前都是单任务的 什么是单任务呢?就是一次只能做一件事 你复制文件的时候,就不能重命名了 那么现在的操作系统,我一边在这边写BLOG,一边听歌,一边开着QQ,一边…………………… 显然,现在的操作系统都是多任务的操作系统 操作系统对多任务的支持是怎么样的呢? 每打开一个程序,就启动一个进程,为其分配相应空间(主要是运行程序的内存空间) 这其实就支持并发运行了 CPU有个时钟频率,表示每秒能执行

Java多线程-并发编程模型

以下内容转自http://ifeve.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E6%A8%A1%E5%9E%8B/: 并发系统可以采用多种并发编程模型来实现.并发模型指定了系统中的线程如何通过协作来完成分配给它们的作业.不同的并发模型采用不同的方式拆分作业,同时线程间的协作和交互方式也不相同.这篇并发模型教程将会较深入地介绍目前(2015年,本文撰写时间)比较流行的几种并发模型. 并发模型与分布式系统之间的相似性 本文所描述的并发模型类似于分布式系统中使

java高并发编程(二)

马士兵java并发编程的代码,照抄过来,做个记录. 一.分析下面面试题 /** * 曾经的面试题:(淘宝?) * 实现一个容器,提供两个方法,add,size * 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束 * * 分析下面这个程序,能完成这个功能吗? * @author mashibing */ package yxxy.c_019; import java.util.ArrayList; import java.util.List

Java 多线程并发编程面试笔录一览

知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法 方式二:声明实现 Runnable 接口的类.该类然后实现 run 方法 推荐方式二,因为接口方式比继承方式更灵活,也减少程序间的耦合. 3.获取当前线程信息? Thread.currentThread() 4.线程的分类 线程分为守护线程.用户线程.线程初始化默认为用户线程. setDaemon(true) 将该线程标记为