多线程
文章平均质量分 72
多线程学习笔记
腹黑的乌鸡
乌鸡的不定时分享
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
线程讲解(十八)
对象锁改进后的代码用到了一个对象锁,该对象锁默认是当前对象,上述代码等同于以下代码:protected void numberOff() { synchronized (this) { for (int i = 0; i < 5; i++) { num++; System.out.println(Thread.currentThread().getName() + ":" + SynchronizedExample.num); } }}当多个线程用一个对象锁,各个线程原创 2021-10-28 11:58:04 · 133 阅读 · 0 评论 -
线程讲解(十七)
synchronized关键字,我们一般称之为“同步锁”,用它来修饰需要同步的方法和需要同步代码块,默认是当前对象作为锁的对象。在用synchronized修饰类时(或者修饰静态方法),默认是当前类的Class对象作为锁的对象,故存在着方法锁、对象锁、类锁这样的概念。没有设置线程同步的情况先给出以下代码感受下代码执行的时候为什么需要同步?代码可能比较枯燥,配上业务理解起来就会舒服很多,学生军训,有三列,每列5人,需要报数,每个线程负责每一列报数。class SynchronizedExample {原创 2021-10-28 11:56:39 · 110 阅读 · 0 评论 -
线程讲解(十六)
fork join框架使用简单实例使用RecursiveTask实现一个累加的功能,使用分而治之的思想,实现分段求和后汇总。public class SumTask extends RecursiveTask<Integer> { private Integer start = 0; private Integer end = 0; public SumTask(int start, int end) { this.start = start;原创 2021-09-22 10:04:06 · 143 阅读 · 0 评论 -
线程讲解(十五)
Fork/Join 框架的限制Fork/Join 框架执行的任务有如下限制:仅可以使用 fork 和 join 操作作为同步机制;如果使用其他的同步机制,当处于同步操作模式下时任务无法被执行。例如:如果想让一个任务在 Fork/Join 框架内休眠一段时间,执行这个任务的工作线程在休眠期间不会去执行其他任务。任务不能抛出异常。任务不能执行I/O操作。几种线程机制的比较截止到 Fork/Join 框架,已经学习了多种线程机制,如 Thread、Executors 和 Fork/Join;这几种原创 2021-09-11 16:18:24 · 147 阅读 · 0 评论 -
线程讲解(十四)
Fork/Join 框架中的任务ForkJoinTask 类是所有在 Fork/Join 框架中执行的任务的基类,它提供了一系列机制来实现 Fork 和 Join 操作。该类有两个子类,分别是 RecursiveAction 和 RecursiveTask。从 RecursiveAction 类继承的子类方法一般没有返回值。从 RecursiveTask 类继承的子类方法则有返回值。任务的创建在创建任务时,最好不要从 ForkJoinTask 类直接继承,而是从该类的子类 RecursiveA原创 2021-09-03 17:44:16 · 241 阅读 · 0 评论 -
线程讲解(十三)
ForkJoinPool 类ForkJoinPool 类是 Fork/Join 框架的核心,也是 Fork/Join 框架执行的入口点,它实现了接口 ExecutorService。ForkJoinPool 类的任务是负责管理线程,并提供线程执行状态和任务处理的相关信息。ForkJoinPool 的创建ForkJoinPool 类从 AbstractExecutorService 类继承,主要用于处理 ForkJoinTask 中的任务。ForkJoinPool 类构造方法有三种形式:1、Fork原创 2021-08-06 09:59:37 · 295 阅读 · 0 评论 -
线程讲解(十二)
概述Fork/Join 框架是适用于多核处理器上并行编程的轻量级并行框架。该框架主要由 Fork 和 Join 两个操作构成:Fork 操作主要用于对任务和数据进行划分,一般是将一个大问题划分为若干个小问题。Join 操作主要用于对各个部分的运行结果进行合并,相当于程序中的一个障栅。两个操作与MapReduce 中的Map/Reduce 操作类似。Fork/Join 框架实现了任务定义和任务处理功能的分离,使程序员在实现并行编程的同时,将更多的精力实现业务逻辑中。在 Java 语言中,Fo原创 2021-08-02 09:13:46 · 195 阅读 · 0 评论 -
线程讲解(十一)
固定数目的线程执行器使用 Executors 类的 newFixedThreadPool() 方法可以创建固定数目的线程执行器,线程的数目可以由用户指定;也可以不指定,默认为当前处理器可以处理的最大线程数。ExecutorService executor = Executors.newFixedThreadPool(4);当提交到线程池的 Runnable 对象数大于执行器可以处理的线程数时,将有部分 Runnable 对象等待。使用线程执行器处理有返回值的线程有返回值的线程定义需要继承 Call原创 2021-07-25 17:45:15 · 121 阅读 · 0 评论 -
线程讲解(十)
线程池前面介绍的内容,都是通过创建线程的方法使程序并行运行的。采用的方法一般是:创建一个 Runnable 对象,然后封装为 Thread 对象,通过 start() 方法启动线程,并在线程运行过程中通过 sleep()、interrupt() 等方法来控制线程的运行。1、之前的程序中,线程的创建、运行、休眠和终止都是要手动完成的,如果需要创建的线程过多的话,这样就很麻烦了。2、创建的线程数量过多或者太少,都不能很好的提高执行效率。3、创建一个新的线程需要的代价很高,尤其是创建多个生命周期较短的线程原创 2021-07-16 15:58:59 · 136 阅读 · 0 评论 -
线程讲解(九)
同步队列同步队列是一个没有数据缓冲的阻塞队列,在同步队列上插入操作必须等待相应的删除执行完成后才能执行,反之亦然。不能调用peek() 方法查看队列中是否有数据,也不允许对整个队列遍历。类 SynchronousQueue 是 Java 集合框架中的一员。该类的定义形式如下:public class SynchronousQueueextends AbstraceQueueimplements BlockingQueue,Serializable其中 E 指明同步队列中元素的类型。该类定义了原创 2021-07-12 09:27:12 · 162 阅读 · 0 评论 -
线程讲解(八)
一.背景:1.因根目录/空间不大,故而想将另一硬盘挂载到根目录下(后发现此想法很是幼稚)二.过程:2.成功输入命令挂载后,发现出现/上被挂了两个东西,且/下剩余空间还是原来一样大,才发现大错特错mount /dev/vdb1 /3.查阅资料后,才知道根目录的重要性,且两个设备挂载在同一文件夹df -h会出现只显示一个硬盘的挂载空间信息且是第一个硬盘的空间信息,虽然两个盘名字都显示挂载在上面了,但后者实际上并没有成功。(因为挂载的意义就是磁盘入口的意思,若是两者都能成功,则数据将向哪存储呢?原创 2021-07-02 18:33:35 · 120 阅读 · 0 评论 -
线程讲解(七)
线程间通信线程作为程序内部的多个执行流,相互之间是可以进行通信的.线程间通信可以通过多种方式来进行,例如:线程间可以通过共享变量进行通信,使每个线程根据共享变量的值进行操作和运算,当通过共享变量进行通信时,通常需要引入线程同步控制;线程间也可以通过wait(),notify()和notifyAll()等方法进行通信.等待集合等待集合(Wait-sets)就像候车室一样,当线程调用wait()方法发生等待后,都要进入到该等待集合中,除非发生一下情况,否则线程会一直在该等待集合中.其他线程调用了方法原创 2021-06-25 19:01:50 · 119 阅读 · 0 评论 -
线程讲解(五)
障栅CyclicBarrier 类是一个同步辅助类,实现了一个称为障栅的集合点,在不是所有线程都到达集合点前,线程之前可以相互等待.Cyclic 的含义是“循环的,周期的”,代表该障栅在所有等待的线程到达集合点并被释放后可以循环使用.CyclicBarrier 类比较适合于线程数量固定的情况.CyclicBarrier 类的构造方法:CyclicBarrier(int parties) //创建障栅对象;parties为需要等待的线程个数.CyclicBarrier(int parties,Run原创 2021-06-11 18:00:27 · 1080 阅读 · 0 评论 -
线程讲解(六)
锁在程序的设计语言中,锁提供了一种数据安全访问的方式,锁一般分为加锁和解锁两个操作.对共享数据操作前,要先进行加锁;操作完成后,再进行解锁.加锁以后的临界区只能被持有锁的线程占有,其他线程不能进入这段临界区,只能等待.Java 语言提供同步锁,可重入锁和读写锁等同步机制,用于确保数据访问的正确性.同步锁在 JAVA 语言中,从 JDK1.0 开始就支持同步锁的使用了.它可以采用两形式:同步方法和同步代码块.不论哪种方式,都需要使用 synchronized 关键字,但两者表现形式不同.同步方法原创 2021-06-25 17:40:46 · 149 阅读 · 0 评论 -
线程讲解(四)
等待集合等待集合(Wait-sets)就像候车室一样,当线程调用wait()方法发生等待后,都要进入到该等待集合中,除非发生一下情况,否则线程会一直在该等待集合中.其他线程调用了方法notify()或notifyAll();其他线程调用了方法interrupt()中断了该线程;方法 wait() 的等待时间结束.wait(),notify(),notifyAll() 方法wait(),notify()或notifyAll()方法是类 Object 中定义的方法,由于 Java 中的类都是 O原创 2021-06-04 15:44:03 · 238 阅读 · 0 评论 -
线程讲解(三)
为什么要使用同步控制当多个线程同时对某一个数据区或内存位置进行操作时,如果不施加任何措施,很可能造成数据操作混乱.如同数据库中的 脏读,不可重复读和幻读等情况.基本概念数据竞争当只有一个线程访问数据时,数据竞争基本不会存在;只有多线程同时访问数据时,才会发生数据竞争.数据竞争问题是有至少两个同时执行的线程访问同一个内存位置并且至少有一个线程尝试写入数据而引起的问题.为了避免数据竞争,通常需要在程序中加入同步机制,以保证数据访问的正确性.有些同步机制(如:锁)可以保证数据在某一时间内只有一个线程原创 2021-05-10 13:59:16 · 126 阅读 · 0 评论 -
线程讲解(二)
线程的管理当线程启动后,可以管理线程,使线程休眠、等待或中断执行等.join() 方法:等待在某些情况下,一个线程需要等另外一个线程执行结束后,才能执行.这种功能可以使用join()方法实现.当调用了某个线程类的对象实例的join()方法,则会等待该对象执行结束.sleep() 方法线程的 sleep() 方法使一个线程暂停一段固定的时间,该方法能够把CPU让给优先级比其低的线程.yield() 方法:让步为了防止某个线程独占 CPU 资源,可以让当前执行的线程休息一下,yield()方法可原创 2021-04-29 09:01:32 · 173 阅读 · 1 评论 -
线程讲解(一)
线程说明跟进程比较,线程的特点:线程本身不能单独运行,它必须在一个程序中运行.线程是程序的内部控制流,一个进程在执行过程中,为了同时完成多个操作,可以创建多个线程,形成多条执行线索.每个线程有自己的堆栈、自己的程序设计器和自己的局部变量.每个进程都有一段专用的内存区域.而同一个进程的各线程间可以共享相同的内存空间(代码空间和数据空间),并且利这些共享内存来实现数据交换、实施通信以及必要的同步工作.线程是程序中的一个执行流,一个执行流是由CPU运行程序代码并操作程序的数据形成的.JAVA 中的线原创 2021-04-28 13:50:08 · 629 阅读 · 2 评论
分享