自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

翻译 Java多线程(十)——Executor

构建线程优势很花时间,因为他涉及到和操作系统的交互。如果你的程序创建了大量生存时间很短的线程,那么你应该使用线程池。线程池包含很多可以等待运行的线程。你可以将一个Runnable对象传递给线程池。当run方法结束之后,线程不会死亡,而是会等待下一次调用。...

2021-04-09 22:18:52 671

翻译 Java多线程(九)——Callables和Futures

Runnable可以将任务包装为异步执行的。你可以将它考虑成没有返回值和参数的异步方法。Callable接口和Runnable接口类似,但是它可以返回值。Callable接口有一个类型参数,且只有一个方法public interface Callable<V>{ V call() throws Exception;}类型参数就是返回结果的类型。比如,Callable<Integer>表示返回整数的异步计算过程。Future保存异步计算的结果。你指示线程开始计算,给定Fu

2021-04-09 12:13:52 176

翻译 Java多线程(八)——线程安全的集合类

如果多个线程同时修改集合类中的元素,那么很容易破坏这种结构。比如,一个线程可能在插入元素,它刚刚找到了自己要插入的桶的位置,刚修改了一部分,结果另外一个线程正在查找一个值,然后这个线程要么会读取不到数据,要么就会形成环,而一直循环。你可以使用锁保护数据,但是你可以使用线程安全的实现。我们之前讨论的阻塞队列就是线程安全的。在下面,我们讨论一些Java支持的其他线程安全的集合类。高效的映射,集合和队列java.util.concurrent包里面实现了高效的映射、集合和队列的实现:ConcurrentHa

2021-04-09 11:26:56 779

翻译 Java多线程(七)——阻塞队列

现在你已经知道了Java多线程编程的基础。但是,在实际编程过程中,你希望不要使用这种底层结构,通常,使用设计者设计好的上层结构比使用底层结构更加简单,而且安全。很多线程问题可以使用一个或多个队列优雅而安全地解决。生产者线程向队列中插入元素,而消费者线程从队列中获取元素,队列可以让对象安全地从一个线程转移到另外一个线程。比如,考虑我们的银行转账程序。我们不直接操作对象,而是向队列中插入转账指令,另外一个线程读取转账指令,然后执行指令。只有这两个线程才有机会访问对象...

2021-04-09 10:43:37 248

翻译 Java多线程(六)——线程同步

在大多数多线程程序中,都需要两个或多个线程共享数据。当两个线程都修改同一个数据时,这个数据怎么变化呢?数据变化会根据数据修改次序的不同而不同,这种情况称为竞争条件(Race Condition)。竞争条件的例子为了避免共享数据的访问冲突,你需要学习如何同步。在这一节,你将会看到如果你不使用同步会发生什么,在下一节,你将会学习如何使用同步。在下面的程序中,我们模拟一个银行的存款。我们随机地在这些账户中转移钱财,每个账户一个线程。每笔转账发生在两个随机的线程间,转钱数量随机。模拟代码非常直接,我们有一个类

2021-04-08 18:13:31 169

翻译 Java多线程(五)——线程属性

在下面,我们讨论线程的一些属性:线程优先级,后台线程,线程组以及未处理异常的处理。线程优先级在Java编程语言中,每个线程都有一个优先级(priority)。默认情况下,线程的优先级是创建它的线程的优先级,你可以使用setPriority()方法设定线程的优先级。你可以将值设定为MIN_PRIORITY(默认情况下是1)到MAX_PRIORITY(默认是10)。NORM_PRIORITY被定义为5.当线程调度器有机会调用新线程时,他倾向于运行优先级高的线程。但是,线程优先级很大程度上依赖于操作系统。当

2021-04-05 21:58:19 187

翻译 Java多线程(四)——线程状态

线程状态主要有六种创建就绪阻塞等待时间等待终止我们将会在后面慢慢介绍。获取当前的状态,你需要调用getState方法。创建状态当你使用new创建线程时,线程还没有运行,这就是创建状态,在他运行之前,你需要配置一些东西。就绪状态一旦你执行了start函数,线程就进入就绪状态,现在线程是可执行的。一个可执行的线程可能在执行,也可能没有执行。这决定于操作系统是否给线程时间执行。当线程执行时,它不一定一直在执行,事实上,我们希望线程经常停止,给其他线程执行时间。线程执行的方式受操作系统

2021-04-05 21:31:00 57

翻译 Java多线程(三)——打断线程

打断线程当run方法返回时,线程结束。此外还有一种强制线程结束的方法,interrupt方法。当对一个线程调用interrupt方法时,线程被设置为打断状态。这是线程中的一个boolean类型的变量,每个线程应当时常检查它是否处于打断状态。也就是说,你应该在你程序中使用下面的代码判断线程是否返回。while(!Thread.currentThread().isInterrupted() && ...){}但是,当线程阻塞时,它没有办法判断是否被打断。这也是Interrupted

2021-04-05 21:03:42 550

翻译 Java多线程(二)——什么是线程

线程是独立于当前程序的运行过程。那么在什么时候需要使用多线程呢?考虑下面的例子。你在一个GUI程序中放了一个球,这个球会向固定的地方运动,当碰到墙壁的时候回反弹,你写了这个程序。Ball ball = new Ball();panel.add(ball);for(int i = 0;i != STEPS;i++){ ball.move(panel.getBounds()); panel.paint(panel.getGraphics()); Thread.sleep(DELAY);}T

2021-04-05 21:02:40 59

翻译 Java多线程(一)——简介

你可能对多任务并不陌生:操作系统似乎有能力同时运行多个任务。比如,你可以边听歌边编辑代码。现在,多数计算机已不再只有一个CPU,并行运行的程序数量不再受到CPU数量的限制。操作系统将不同的CPU时间片分配给不同的程序,让他们并行运行。多线程程序将并行的概念运用到程序本身,单个程序将在同一时间运行多个任务。每个任务通常叫做一个线程。可以同时运行多个线程的程序称为多线程程序。所以,多进程和多线程的区别是什么?最重要的区别是,进程拥有独立的一整套变量,线程共享数据。这听起来很不安全,事实上也是的。但是,共享内

2021-04-05 15:07:33 67

翻译 Collections(四)——算法

泛型集合接口的一个重要优势就是你可以只实现一次算法。比如,考虑一个找出序列中最大值的算法。以前,人们使用循环实现。if (a.length == 0) throws new NoSuchElementException();T largest = a[0];for(int i = 0;i != a.length;i++) if(largest.compareTo(a[i]) < 0) largest = a[i];同时,为了找到一个ArrayList中的最大值,你需要稍微改动一下代码

2021-04-05 11:45:51 111

翻译 Collections(三)——具体集合类

我们首先看下Java标准库提供了哪些集合类,之后在回顾Collection框架,下面列出了所有具体的Java集合类,线程安全的集合类在后续会讨论,此处不列出。除了以Map结尾的集合类,其他所有集合类集成自Collection接口,Map类实现了Map接口。我们稍后讨论。集合类类型描述ArrayList使用数组存储的序列数据,会自动扩容LinkedList使用链式结构存储数据,可以高效地删除和插入元素ArrayDeque使用数组实现的双端队列HashSet没有重

2021-04-04 19:15:36 146

翻译 Collections(二)——集合接口

集合接口Java的早期版本只发布了一些简单的集合类接口:Vector, Stack, Hashtable, BitSet和Enumerate接口,提供几种元素的访问方法。这是一个聪明的决定——编写合适的容器类显然需要很长时间的思考。在Java 1.2发布时,设计者感觉发布稍微成熟的数据接口的时间到了。他们面临一些相反的选择,想要设计一种简单易学的接口。他们想要C++中STL类的泛型算法,但是又不想要STL中的复杂度。在这一章,我们考虑Java的一些设计,并解释为什么要这样设计。将接口和实现分离作为现

2021-04-02 22:18:12 77

翻译 Collections(一)——简介

简介你选择的数据结构会极大地影响你的程序的性能。你需要从大量数据中快速搜索得到数据吗?你需要在序列中间快速插入和删除元素吗?你需要在键值对之间建立联系吗?这一章介绍Java支持的数据结构,可以让你实现不同的需求,在大学课程中,有一各专门的课程介绍数据结构。...

2021-04-02 16:42:16 117

翻译 泛型编程(七)

反射与泛型Class类是泛型的,比如String.Class就是Class<String>类的一个对象。类型参数很有用,因为他可以让Class<T>的方法更具体,Class<T>在下面的函数中使用了类型参数:T newInstance();T cast(Object obj);T[] getEnumConstants();Class<? super T> getSuperclass();Constructor<T> getConstru

2021-04-01 20:44:36 89

翻译 泛型编程(六)

通配符类型长期以来,强类型语言已知被诟病,Java设计者提出了通配符类型,比如Pair<? extends Employee>表示所有类型变量集成自Employee的Pair泛型类,比如Pair<Manager>,但不包含Pair<String>。比如你想编写一个函数,输出员工对的信息。public static void printBuddies(Pair<Employee> p){ Employee first = p.getFirst()

2021-04-01 20:14:15 89

翻译 泛型编程(五)

泛型类的继承规则让我们来考虑下面的问题,考虑一个类Employee和它的子类Manager,问题是Pair<Manager>是不是Pari<Employee>的子类,答案是不是,比如,下面的代码Manager topHonchos = ...;Pair<Employee> result = ArrayAlg.minmax(topHonchos); // 错误minmax函数返回Pair<Manager>类型,而他不能转换为Pair<Employ

2021-03-31 15:22:51 48

翻译 泛型编程(四)

泛型编程的局限性下面介绍泛型编程的局限性,他们中大多数都是因为类型擦除引起的。类型参数不能为原始类型你无法使用原始类型初始化类型参数,比如,你没有办法使用Pair<double>,只有Pair<Double>。究其原因,是因为类型擦除之后,泛型类型被Object或者边界类型代替,但是double并不是从Object继承而来。这一点通常非常难受,但并不致命,因为你可以使用包装类。运行时类型检查只对类型擦除后的类有效Java虚拟机内部没有泛型类,因此当你在运行时进行类型检查时

2021-03-31 15:06:09 67

翻译 泛型编程(三)

泛型编程(三)——泛型代码与虚拟机Java虚拟机没有所谓的泛型类型——所有的类型都是原始类型。当你定义泛型类时,编译器生成一个同名的原始类型,直接移除泛型参数,使用泛型参数的地方将会被他们的边界类型代替(如果没有的话,就使用Object类型代替)。比如,之前定义的Pair<T>类型将会使用下面的类定义代替public class Pair{ public Pair(Object first,Object second) { this.first = first; this.s

2021-03-31 13:40:06 76

翻译 泛型编程(二)

泛型编程(二)简单泛型类的定义比如我们想要定义一个包含两个同类型数据的类Pair,为了让类的可扩展性更强,可以使用泛型编程public class Pair<T>{ public Pair(){first = null;second = null;} public Pair(T first,T second){ this.first = first; this.second = second;} public T getFirst() {return first;} publi

2021-03-29 20:57:01 66

翻译 泛型编程(一)

泛型编程泛型编程的用途泛型编程最早在Java SE5引入,泛型编程可以避免频繁地使用Object变量和类型转发,使代码更安全高效。在Java SE 5之前,泛型编程依靠类的继承机制实现,ArrayList类可以使用Object数组实现。public class ArrayList // before java se 5{ public Object get(int i){...} public void add(Object o){...} ... private Object[] ele

2021-03-29 20:06:35 85

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除