为什么需要线程池 在生产环境中,我们不能无限制的创建线程,主要原因如下: 线程创建与销毁的代价并不低; 如果可运行的线程数量多于可用处理器的数量,有些线程将会闲置,大量闲置的线程会消耗系统资源(内存)并给垃圾收集器带来压力; 大量线程竞争CPU也会造成不小的性能开销。 Executor框架 Executor框架在Java 5中被引入,其内部使用了线程池机制。它在java.util.cocurrent包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。 Executor框架包括:线程池,Executor,Executors,ExecutorService等(Callable与Future本篇不进行讨论)。 Executor接口 我们先来了解一下其中的Executor接口: public interface Executor { void execute(Runnable command); } Executor接口的定义非常简单,但它却为灵活 继续阅读 >>


董恒毅 18/09/13 21:38:05
一、问题描述 生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例。生产者生成一定量的数据放到缓冲区中,然后重复此过程;与此同时,消费者也在缓冲区消耗这些数据。生产者和消费者之间必须保持同步,要保证生产者不会在缓冲区满时放入数据,消费者也不会在缓冲区空时消耗数据。不够完善的解决方法容易出现死锁的情况,此时进程都在等待唤醒。 示意图: 二、解决方法 思路 采用某种机制保护生产者和消费者之间的同步。有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式。 在生产者和消费者之间建立一个管道。管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强。 解决问题的核心    保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用信号或加锁机制,保证资源在任意时刻至多被一个线程访问。 Java能实现的几种方法 wait() / noti 继续阅读 >>


李猛 18/08/16 08:40:50
关于Java线程的状态网上的说法不一,有的说是6种状态,有的说是5中状态,索性就查看了一下Java源码。Thread类里面有一个枚举类,如下: public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; } 这个枚举类里面有6种类型,所以Java中的线程有6种状态。 关于各种状态的简单说明: NEW(初始):线程被创建后尚未启动。 RUNNABLE(运行):包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在运行,也可能正在等待系统资源,如等待CPU为它分配时间片。 BLOCKED(阻塞):线程阻塞于锁。 WAITING(等待):线程需要等待其他线程做出一些特定动作(通知或中断)。 TIME_WAITING(超时等待):该状态不同于WAITING,它可以在指定的时间内自行返回。 TERMINATED(终止):该线 继续阅读 >>


李猛 18/08/15 08:19:50
synchronized 同步方法 方法内的变量线程安全,实例变量非线程安全。调用关键字synchronized声明的方法一定是排队运行的,如果不是共享资源,那么根本就没有同步的需要。 关键字synchronized取得的锁都是对象锁,而不是把一段代码或方法(函数)当做锁。对于多线程访问同一对象,哪个对象先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,其他线程就只能等待;但是如果多个线程访问多个对象,则JVM会创建多个锁。 A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法;但B线程如果在这时调用object对象中的synchronized类型的方法需要等待,也就是同步。 脏读是指在读取实例变量时,此值已经被其他线程更改过了。对于实例变量的getValue和setValue方法都要是同步的才能保证不出现脏读。 关键字synchronized拥有锁重入的功能,也就是在使用synchr 继续阅读 >>


李猛 18/08/06 19:22:51
一起来学习JVM吧 我们在学习C++的时候知道,每一个new操作都要对应相应的delete操作,否则会出现内存泄漏的问题,同理C语言的malloc和free也是如此。那么对于Java这门语言,我们却无需这样做,这一切都归结于JVM的强大,在虚拟机自动内存管理机制的帮助下,我们一般只需创建对象(申请内存),而不需要关注或者主动的销毁对象。不过,也正是因为我们把内存控制的权力交给了JVM,一旦出现内存泄漏和溢出方面的问题,如果不了解JVM如何使用内存,那么排查起来会异常困难。所以这篇博客就让我们来看看Java的内存区域~ JVM在执行Java程序的过程中会把它所管理的内存划分为JVM将内存主要划分为五个区域:方法区、Java堆、虚拟机栈、本地方法栈、程序计数器。如下如所示: 我们一个一个来看这些区域都有什么用途~ 程序计数器(Program Counter Register) 这是一块较小的内存空间,是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条 继续阅读 >>


贺含悦 18/07/27 01:18:40
使用多线程 单线程同步,CPU利用率低;而线程异步,运行效率高。 1. 实现 Runnable 接口 class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } PrimeRun p = new PrimeRun(143); new Thread(p).start(); Runnable只是一个接口,它里面只有一个run()方法,没有start()方法,可以使用Thread类来启动。由此可见Runnable接 继续阅读 >>


李猛 18/07/26 10:55:43
ArrayList源码分析 ArrayList简介 我们知道,ArrayList是基于数组实现的List类,完全支持List接口的全部功能,底层实质上就是一个Object[]数组。从源码注释的第一行“Resizable-array implementation of the List interface”中,可以看出ArrayList是List接口的可变长数组实现,即这是一个动态数组,与普通的数组相比,它可以实现容量的动态增长。至于其他的特征,我们可以从类的定义中得到: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 这是ArrayList的类结构层次图: 由以上信息,我们可以知道: ArrayList:表明ArrayList支持泛型 exten 继续阅读 >>


贺含悦 18/06/29 18:06:53
为期两周的课设终于结束了,我们组选择的题目当然是我邮软件祖传的课设项目TTMS(Theater Ticket Management System 剧院票务管理系统),说来也很惭愧,整个项目自打三月份人机界面课程大作业时候就已经开始,直到现在六月份,开发周期长达三个月,然而功能上还有很多欠缺。 项目首页: https://github.com/fujie-xiyou/TTMS_2.0 那就先从项目的界面说起 界面部分采用JAVAFX开发,JAVAFX是JAVA8主推的图形库,相比Swing有很多方便的特性,比如对css的支持,就让我们的项目在美化过程中变得非常轻松。 而JAVAfx的缺点在于官方文档不够全面,网上的资料也相对比较少,做很多东西都要查资料查很久或者自己慢慢摸索。 说几个界面开发过程中的坑点 Javafx时间选择器 在开发 演出计划管理 用例时,需要给用户提供一个选择时间日期的工具,而javafx也自带了日期选择器,令人不解的是却没有提供时间选择器!!! 如果直接让用 继续阅读 >>


刘付杰 18/06/20 21:19:58
Java泛型是什么? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 即其本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。 泛型带来了哪些好处? 在没有泛型之前,当我们将一个对象放进集合中,集合会立刻忘记该对象的类型,它会把所有对象都当作Object类型来处理。所以从集合中取出对象的时候,我们通常需要进行强制类型转换,这种做法不仅造成代码的臃肿,而且容易引起异常。 在增加了泛型支持后: 集合可以记住元素的类型,并且在编译的时候检查元素类型,避免引起ClassCastException异常。将运行时的异常提前至了编译时。 所有的强制转换都是自动和隐式的,提高代码的重用率。 使代码更加简洁,程序更加健壮。 定义泛型 Java在接口、类或类的方法的声明中,声明一个泛型。多个参数时要用逗 继续阅读 >>


贺含悦 18/06/12 19:59:00
ECharts 官网的内容已经非常详细了,我就不再赘述。下面写写我使用时遇到的问题: 饼状图无法添加标题: 实际上也是设置title字段,只是这个字段是在option下而非series下(刚开始大意了) 饼状图添加内容百分数显示: tooltip : { trigger: 'item', formatter: "{a} <br/>{b} : {c} ({d}%)" }, 作者:baidu_35085676 发表于 2018/06/11 10:42:59 原文链接 https://blog.csdn.net/baidu_35085676/article/details/80648643 阅读:226 继续阅读 >>


李余通 18/06/11 10:42:59