02-05-多线程
yuhaibao324
一直以来我们找不到对的人,是因为我们不能改变错误的自己!
展开
-
线程创建的三种方式
线程创建的三种方式1、Callable2、Thread3、Runableimport java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.conc...原创 2019-06-17 19:48:30 · 172 阅读 · 0 评论 -
Java线程学习12--案例--线程本地变量ThreadLocal
先说明ThreadLocal存放的值是线程内共享的,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递,这样处理后,能够优雅的解决一些实际问题,比如Hibernate中的OpenSessionInView,就是使用ThreadLocal保存Session对象,还有我们经常用ThreadLocal存放Connection,代码如:/** * 数据库连接...原创 2019-06-23 00:37:55 · 97 阅读 · 0 评论 -
Java线程学习12--案例--阻塞队列BlockingQueue
Java.util.concurrent包是个强大的包! 这一段时间我的工作主要是改进公司的调度器,调度器调度线程池执行任务,生产者生产任务,消费者消费任务,那么这时就需要一个任务队列,生产者向队列里插入任务,消费者从队列里提取任务执行,调度器里是通过BlockingQueue实现的队列,随后小查一下,下面看看BlockingQueue的原理及其方法。 ...原创 2019-06-23 00:37:52 · 151 阅读 · 0 评论 -
Java线程学习11--Fork/Join-Java并行计算框架
并行计算在处处都有大数据的今天已经不是一个新鲜的词汇了,现在已经有单机多核甚至多机集群并行计算,注意,这里说的是并行,而不是并发。严格的将,并行是指系统内有多个任务同时执行,而并发是指系统内有多个任务同时存在,不同的任务按时间分片的方式切换执行,由于切换的时间很短,给人的感觉好像是在同时执行。 Java在JDK7之后加入了并行计算的框架Fork/Joi...原创 2019-06-23 00:37:40 · 122 阅读 · 0 评论 -
Java线程学习10--CAS
在Java并发包中有这样一个包,java.util.concurrent.atomic,该包是对Java部分数据类型的原子封装,在原有数据类型的基础上,提供了原子性的操作方法,保证了线程安全。下面以AtomicInteger为例,来看一下是如何实现的。public final int incrementAndGet() { for (;;) { i...原创 2019-06-23 00:37:29 · 72 阅读 · 0 评论 -
Java线程学习09--Condition-线程通信更高效的方式
上一篇讲述了并发包下的Lock,Lock可以更好的解决线程同步问题,使之更面向对象,并且ReadWriteLock在处理同步时更强大,那么同样,线程间仅仅互斥是不够的,还需要通信,本篇的内容是基于上篇之上,使用Lock如何处理线程通信。 那么引入本篇的主角,Condition,Condition 将 Object 监视器方法(wait、notify 和 notify...原创 2019-06-23 00:37:21 · 96 阅读 · 0 评论 -
Java线程学习08--锁对象Lock-同步问题更完美的处理方式
Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我们拿Java线程(二)中的一个例子简单的实现一下和sychronized一样的效果,代码如下:public class LockTest { public static void main...原创 2019-06-23 00:37:11 · 76 阅读 · 0 评论 -
Java线程学习07--Callable和Future
并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。 Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执...原创 2019-06-22 16:30:56 · 72 阅读 · 0 评论 -
Java线程学习06--线程池
自JDK5之后,Java推出了一个并发包,java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池、Integer的共享池、连接数据库的连接池、Struts1.3的对象池等等,池的最终目的都是节约资源,以更小的开销做更多的事情,从而提高性能。我们的web项目都是部署在服务器上,浏览器端的每一个request...原创 2019-06-21 03:05:41 · 79 阅读 · 0 评论 -
Java的concurrent用法详解
我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便。而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait()、notify()和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的...原创 2019-06-21 02:56:40 · 22216 阅读 · 1 评论 -
Java线程学习05 --Timer和TimerTask
Timer和TimerTask可以做为实现线程的第三种方式,前两中方式分别是继承自Thread类和实现Runnable接口。Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。一个Timer可以调度任意多个Ti...原创 2019-06-21 02:52:38 · 96 阅读 · 0 评论 -
Java线程学习04--线程中断、线程让步、线程睡眠、线程合并
理解了线程同步和线程通信之后,再来看本文的知识点就会简单的多了,本文是做为传统线程知识点的一个补充。有人会问:JDK5之后有了更完善的处理多线程问题的类(并发包),我们还需要去了解传统线程吗?答:需要。在实际开发中,无外乎两种情况,一个是开发新内容,另一个是维护原有程序。开发新内容可以使用新的技术手段,但是我们不能保证原有程序是用什么实现的,所以我们需要了解原有的。另外一...原创 2019-06-21 02:47:46 · 100 阅读 · 0 评论 -
Java线程学习03 --线程协作-生产者/消费者问题
上一篇讲述了线程的互斥(同步),但是在很多情况下,仅仅同步是不够的,还需要线程与线程协作(通信),生产者/消费者问题是一个经典的线程同步以及通信的案例。该问题描述了两个共享固定大小缓冲区的线程,即所谓的“生产者”和“消费者”在实际运行时会发生的问题。 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证...原创 2019-06-21 02:30:20 · 70 阅读 · 0 评论 -
Java线程学习02 --线程同步synchronized和volatile(线程的互斥(同步))
要说明线程同步问题首先要说明Java线程的两个特性,可见性和有序性。多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现。上个实例运行说明:例子来说明,在多个线程之间共享了Count类的一个对象,这个对象是被创建在主内存(堆内存)中,每个线程都有自己的工作内存(线程栈),工作内存存储了主内存Count对象的一个副本,当线程操作Count对象时,首先从主内存复...原创 2019-06-21 02:49:54 · 128 阅读 · 0 评论 -
Java线程学习01 --线程安全与不安全
学完的知识如果不使用或者不常常回顾,那么还不是自己的知识。基础:Java,JavaSE基础没,JavaEE,前台开发(html、css、javascript、query、extjs)框架:Struts、hibernate、spring、springMVC、SpringBoot、SpringCloud、Mybatis、Mybatis-plus数据层:linux、oracle当我们查看...原创 2019-06-21 02:49:35 · 103 阅读 · 0 评论 -
多线程 -- 线程通讯 -- ReentrantLock互斥锁
多线程(JDK1.5的新特性互斥锁)* 1.同步 * 使用ReentrantLock类的lock()和unlock()方法进行同步* 2.通信 * 使用ReentrantLock类的newCondition()方法可以获取Condition对象 * 需要等待的时候使用Condition的await()方法, 唤醒的时候用signal()方法 * 不同的线程使用不同...原创 2019-06-17 19:37:25 · 102 阅读 · 0 评论 -
Java线程学习12--案例--ThreadLocal线程本地变量的详解
1.ThreadLocal是什么ThreadLocal正如他的中文翻译 线程本地变量所说,顾名思义,就是每个线程自己的本地变量。简单的来说,就是在多线程的程序中,我们一般会申请共享变量。给所有线程使用。但是很多情况下,每个线程会对共享变量进行改变。比如,一个String 类型的static变量,线程一将String 赋值为 “线程一”,然后在跑其他的逻辑的时候,第二个线程...原创 2019-06-23 00:37:57 · 239 阅读 · 0 评论