
Java 线程
Brimen_do
高度自律就能高度自由
展开
-
线程的基本知识
1、进程和线程区别进程:应用程序的执行实例,有独立的内存空间和系统资源。线程:CPU调度和分派的基本单位,进程当中执行运算的最小单位,可完成一个独立的顺序控制流程。联系(1)、一个线程只能有一个进程,一个进程可以有多个线程。(2)、资源分配给进程,同一进程当中的所有线程共享该进程的所有资源。(3)、线程在执行过程当中需要协作同步,不同进程的线程要利用消息通讯的方法实现同步。2、线程...原创 2019-03-05 18:27:47 · 390 阅读 · 0 评论 -
Java线程-线程池-自定义线程池
自定义线程池,代码如下:public class ThreadExtend_Pool_Custom extends Thread { private String name;//线程的名字 public ThreadExtend_Pool_Custom(String name){ this.name=name; } @Override pu...原创 2019-03-11 19:11:46 · 3982 阅读 · 0 评论 -
Java线程-线程池-带返回值
Java5之前,线程是没有返回值的。Java5之后,可以写有返回值的任务了。有返回值的任务必须实现Callable接口,没有返回值的任务实现Runnable接口。执行Callable接口后,可以获得一个Future的一个对象,通过Feture的get方法就能获得返回的Object数据了。代码如下:public class ThreadExtend_Pool_Return_Value {...原创 2019-03-12 09:54:19 · 7372 阅读 · 0 评论 -
Java线程-线程池-锁(lock)
在Java5当中,专门提供了锁对象,利用锁可以方便的实现对资源的封锁,用来控制对竞争资源并发访问控制,这些内容主要集中在java.util.concurrent.locks包下面,里面有三个重要的接口Condition、Lock、ReadWriteLock。Condition将Object监视器方法(wait、notify和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lo...原创 2019-03-12 10:34:33 · 5657 阅读 · 0 评论 -
Java线程-线程池-读写锁
上文使用lock接口以及对象,很好的实现了对竞争资源的访问控制,这种锁不区分读写,成为普通锁。为了提高性能,Java提供了读写锁。在读的地方使用读锁,在写的地方使用写锁。在一定程度上提高了程序的执行效率。Java中读写锁有个接口java.util.concurrent.locks.ReadWriteLock,也有具体的实现ReentrantReadWriteLock,详细的API可以查看Java...原创 2019-03-12 10:53:03 · 344 阅读 · 0 评论 -
Java线程-信号量
Java的信号量实际上是一个功能完毕的计数器,对控制一定资源的消费与回收有着很重要的意义,信号量常常用于多线程的代码中,并能监控有多少数目的线程等待获取资源,并且通过信号量可以得知可用资源的数目等等,这里总是在强调“数目”二字,但不能指出来有哪些在等待,哪些资源可用。代码如下:public class Main { public static void main(String args...原创 2019-03-12 11:20:39 · 190 阅读 · 0 评论 -
Java线程-阻塞队列
阻塞队列是Java5线程特征当中新增的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue。阻塞队列的概念是:如果指定长度的队列满了,添加新元素的操作就会被阻塞等待,直到有空位位置。有了这样的功能,就为多线程排队等候的模型提供了便捷的通道。java.util.concurrent.BlockingQueue继承了java.util.Queue接...原创 2019-03-12 13:49:44 · 477 阅读 · 0 评论 -
Java线程-线程池-阻塞栈
阻塞栈和阻塞队列类似,不同的是,阻塞栈是“后入先出”的结构。阻塞队列是“先入先出”的结构,每次操作的都是队列头。阻塞栈是Java6的新特征。Java为阻塞栈定义了接口:java.util.concurrent.BlockingDeque,其实现类也比较多,具体可以查看JavaAPI文档。代码如下:public class Thread_Bdueue { public static ...原创 2019-03-12 14:00:03 · 321 阅读 · 0 评论 -
第十六章 Spring Cloud GateWay
在上一篇文章当中,大家对Spring Cloud GateWay有了一个初步的认识,网关作为一个系统的流量入口,有着举足轻重的作用。网关的作用:(1)、协议转换、路由转发。(2)、流量控制。(3)、权限判断。(4)、缓存。流程详述:客户端向Spring Cloud GateWay发出请求,GateWay Handler Mapping 确定与之对应的路由,然后再发送到GateWay ...转载 2019-03-16 22:01:11 · 143 阅读 · 0 评论 -
Java线程-线程池-条件变量
条件变量是Java5线程当中很重要的一个概念,顾名思义,条件变量就是条件当中的一种变量,这里的条件没有实际意义,仅仅是个标记而已。条件变量都实现了java.util.concurrent.locks.Condition接口,条件对象的实例化是通过一个lock对象上调用newCondition()方法来获取的,这样条件就和一个锁对象绑定起来,Java当中的条件变量只能和锁配合使用,来控制并发程序访...原创 2019-03-12 14:42:23 · 833 阅读 · 0 评论 -
Java线程-线程池-原子操作
所谓的原子量就是该变量是原子的,该操作不可再分,因此是线程安全的。为何会使用原子量呢?原因是多个线程操作同一个变量也会引发问题,在Java5之前,可以通过volatile、synchronized关键字来解决并发访问的安全问题,但是这样解决太麻烦。Java5之后,专门提供了用来进行单变量多线程并发安全访问的工具包java.util.concurrent.atomic,其中的类也很简单。下面给...原创 2019-03-12 15:08:54 · 595 阅读 · 0 评论 -
Java线程-障碍器(CyclicBarrier)
Java5当中添加了障碍器,为了适应一种新的设计需求,比如说一个大型任务,有很多的子任务,只有当子任务都完成了,才能执行主任务,这个时候就需要障碍器。障碍器是多线程并发控制的一种有效的手段。示例如下:public class Thread_CyclicBarrier { public static void main(String args[]){ //创建障碍器,并...原创 2019-03-12 15:21:39 · 216 阅读 · 0 评论 -
Java线程-线程池
Sun在Java5当中,对线程的类库做了大量的扩展,线程池是Java5的新特征之一。有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类。线程池的思想是一种对象池的思想,开辟了一块内存空间,里面放了很多的线程,线程的执行调度由池管理器来进行处理,当有线程任务时,会从池子当中取一个进行执行,当任务执行完成以后,重新放入池子,以便于给其它任务...原创 2019-03-13 17:15:00 · 194 阅读 · 0 评论 -
Java线程-线程池-延迟连接池
创建一个可以延迟的连接池子,并且固定大小为2。如果线程数量超过2,那么,当前线程就会进入等待状态,直到其它线程用完之后,再获得被释放的池子执行任务。public class ThreadExtend_Pool_Scheduled extends Thread {public class ThreadExtend_Pool_Scheduled extends Thread { priva...原创 2019-03-11 18:43:33 · 2033 阅读 · 0 评论 -
Java线程-线程池-固定大小
Sun在Java5当中,对线程的类库做了大量的扩展,线程池是Java5的新特征之一。有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类。线程池的思想是一种对象池的思想,开辟了一块内存空间,里面放了很多的线程,线程的执行调度由池管理器来进行处理,当有线程任务时,会从池子当中取一个进行执行,当任务执行完成以后,重新放入池子,以便于给其它任务...原创 2019-03-11 18:17:38 · 1566 阅读 · 0 评论 -
线程安全类-线程同步
当一个类很好的同步并保护它的数据时,那么这个类就可以说是“线程安全的”在类的层面上来说是线程安全的,但是操作多个线程仍然不是安全的。比如说一个集合是线程安全的,两个线程操作同一个集合对象,第一个线程查询集合非空后,删除集合当中的第一个元素。第二个线程也执行与第一个线程相同的操作,第一个线程查询非空后,第二个线程查询也非空。第二个线程再执行删除,显然是不对的,因此此时集合已经没有元素了。举个例...原创 2019-03-11 17:29:08 · 231 阅读 · 0 评论 -
线程的基本实现
在Thread对象上调用start()方法,方法处于就绪状态,而不是调用别的方法。在调用start()方法之前,线程还处于新建状态。调用sart()方法之后,线程获得机会后会调用run()方法,这个时候run方法里面可以编写一些自己的业务逻辑。1、实现Runnable接口public class RunnableImpl implements Runnable { private ...原创 2019-03-05 19:03:46 · 128 阅读 · 0 评论 -
线程的调度-睡眠
Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能。不管程序怎么编写,我们只能最大限度的去影响程序执行的次序,而无法做到精确控制。线程休眠时,会将CPU资源交给其它线程,当休眠一定时间后或者达到一定条件之后,重新进入就绪状态,等待线程的执行。线程休眠的方法是Thread.sleep(long millis)和Thread.sleep(long millis, in...原创 2019-03-06 10:13:03 · 223 阅读 · 0 评论 -
线程的交互-等待和唤醒
线程的等待:(1)、void notify() 唤醒在此对象监视器上等待单个线程。(2)、void notifyAll() 唤醒在次对象监视器上等待的所有线程。线程的唤醒:(1)、void wait() 导致当前线程等待,直到其它线程调用此对象的notify()和notifyAll()方法。(2)、void wait(long timeout) 导致当前线程等待,直到其它线程调用此对象的...原创 2019-03-06 10:41:01 · 177 阅读 · 0 评论 -
线程的调度-让步
线程让步的含义是运行着的线程让出CPU资源,交给其它线程运行,但是交给谁,它并不清楚,一般情况下,谁抢到,谁就运行。线程的让步使用Thread.yield()方法,它是一个静态方法,暂停当前正在执行的线程对象,并留机会给其它线程执行。代码如下:public class Thread_Yield extends Thread { public static void main(Strin...原创 2019-03-06 11:00:03 · 271 阅读 · 0 评论 -
线程的调度-优先级
与线程休眠类似,线程的优先级无法保障线程的执行此讯,只不过是优先级高的线程获得CPU的概率比较大,而优先级低的线程并不是没有机会执行。优先级用1-10的整数来进行表示,数值越大的优先级越高,默认情况下,有限级是5。在一个线程当中开启另外一个新线程,则该新线程成为该线程的子线程。public class Thread_Priority { public static void main...原创 2019-03-06 11:14:45 · 509 阅读 · 0 评论 -
线程的调度-合并
线程合并的含义就是将几个并行的线程合并为单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕后才能执行,可以使用join()方法。join()为非静态方法,定义如下:(1)、void join() 等待该线程终止(2)、void join(long millis) 等待该线程终止最长时间为millis毫秒。(3)、void join(long millis,int nanos) 等...原创 2019-03-06 11:44:11 · 221 阅读 · 0 评论 -
线程的调度-守护线程
守护线程与普通线程在写法上基本没有啥区别,调用线程对象的setDaemon(true),可以设置为守护线程。守护线程使用情况较少,并非没用。比如说:Java的垃圾回收、内存管理都属于守护线程;还有我们在做数据库应用时,使用的数据库连接池,也有很多后台应用,监控连接个数、超时时间和状态等。当设置setDaemon(true)时,必须在启动之前进行调用。public class Thread_D...原创 2019-03-06 11:57:23 · 217 阅读 · 0 评论 -
线程同步-同步方法
防止多个线程访问数据对象时,对数据造成破坏或者是说多个线程访问同一个对象进行数据处理时,发生了错误,因此就需要线程同步。我们来创建一个实例进行说明:我们来构建一个信用卡账户,起初额度为100w,然后模拟透支,存款等操作。1、创建一个非同步的实例第一步:创建一个User对象创建一个User对象,添加两个变量账号(code)和余额(cash);添加一个处理业务的方法oper()。代码如下:...原创 2019-03-06 15:10:22 · 312 阅读 · 0 评论 -
线程的同步-同步块
线程的同步,除了同步方法外,我们还可以使用代码块,使用代码块比同步方法有更好的效果。。追其同步的根本目的,是控制竞争资源的正确访问,因此只要在访问竞争资源的时候,只要保证同一时刻只能有一个线程访问即可,因此Java引入了同步代码块的策略,以提高其性能。我们对上一篇文章进行改进:User类:package thread_synchronization;public class User {...原创 2019-03-06 15:28:48 · 246 阅读 · 0 评论 -
Java线程-并发协作-生产者消费者模型
不管任何语言,生产消费者模型都是最经典的,就像每一门编程语言“Hello World!”一样。准确来说,应该是“生产-消费-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。业务描述如下:(1)、生产者在仓库未满时进行生产,仓库满了,则停止生产。(2)、消费者仅仅在仓库有产品时才能进行消费,空仓则进行等待。(3)、当消费者发现仓库没有产品可以消费时,就通知生产者进行生产。(4...原创 2019-03-06 16:12:55 · 153 阅读 · 0 评论 -
Java线程-并发协作-死锁
线程发生死锁的可能性很小,即使看似发生死锁的代码,在运行时发生死锁的可能性小之又小。发生死锁的原因一般情况下是两个对象的锁相互等待造成的。代码如下:package Test;/** * java线程,并发协作,死锁 */public class ThreadExtend_DeadLock extends Thread{ private DeadLock deadLock;...原创 2019-03-06 16:32:11 · 232 阅读 · 0 评论 -
Java线程-闭锁(CountDownLatch)
CountDownLatch有时被称为“闭锁”,其作用相当于一扇门:在CountDownLatch达到结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。当CountDownLatch到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态。CountDownLatch可以用来确保某些活动直到其它活动都完成后才继续执行。她与Cycl...原创 2019-03-14 16:34:48 · 318 阅读 · 0 评论 -
Java线程-异步获取执行结果(FutureTask)
FutureTask可用于异步获取执行结果或者取消执行任务的场景,通过传入Runnable或者Callable的任务给FutureTask,调用run()方法放入线程池,之后通过外部的FutureTask的get()方法获得结果。FutureTask主要用于非常耗时的计算。1、执行多任务计算利用FutureTask和ExecutorService,可以用多线程的方式提交计算任务,主线程继续执行...原创 2019-03-13 17:28:37 · 4847 阅读 · 3 评论