精华内容
下载资源
问答
  • 一:CountDownLatchCountDownLatch...等所有士兵的集合线程都执行完毕,才能继续晨练线程执行跑步操作。那么我们怎么快速地统计已经集合的士兵线程数,以及怎样在集合完毕后第一时间启动跑步呢?这里就需要用到Count...

    一:CountDownLatch

    CountDownLatch是一个执行 完成任务线程数 的 倒数计数器。我们考虑这种情况:士兵晨练,必须全队士兵集合完毕才开始跑步。用程序描述就:在晨练线程中,逐个启动士兵的集合线程,执行集合动作;等所有士兵的集合线程都执行完毕,才能继续晨练线程执行跑步操作。那么我们怎么快速地统计已经集合的士兵线程数,以及怎样在集合完毕后第一时间启动跑步呢?这里就需要用到CountDownLatch。

    1:首先,我们在晨练线程中创建一个CountDownLatch:static final CountDownLatch countDownLatch = new CountDownLatch(10);//构造参数说明有多少个需要完成的线程

    2:在每个士兵的集合线程中,通过:countDownLatch.countDown();  //说明当前线程已经执行到屏障处,把倒数计数器值减1

    3:在晨练线程中,通过:countDownLatch.await();  //暂时挂起线程,等待倒数计数器为0时自动唤醒,继续执行

    二:CyclicBarrier

    与countDownLatch相反,这是一个加法计数器的同步屏障,并且可以重复使用。它在每个线程中设置屏障点,当一个线程执行到屏障点时就需要停下,计数器+1,直到计数器达到创建时指定值时执行相应的响应线程,并且全部线程继续执行,直到下一个屏障处等待或者执行完毕。

    1:创建CyclicBarrier同步屏障对象,设置屏障处计数值以及达到该值后执行什么响应动作线程:

    CyclicBarrier barrier = new CyclicBarrier(n, new BarrierDone_Run());

    2:在BarrierDone_Run线程中,定义  执行到屏障处而停顿的线程数达到设定值  时,启动响应线程执行后续操作。

    3:逐个启动工作线程,在工作线程的run()方法中,通过: barrier.await();  //设定屏障,当线程执行到这步时挂起,直到计数器达到设定值时才继续执行

    三:比较

    1:CountDownLatch是把主干线程挂起,在任务线程中进行倒数计数,直到任务线程执行完才唤醒主干线程继续执行;

    CyclicBarrier是把任务线程挂起,直到所有任务线程执行到屏障处再放行继续执行;

    2:CountDownLatch达到屏障放行标准后放行的是主干线程;

    CyclicBarrier达到屏障放行标准后放行的是任务线程,并且还会额外地触发一个达到标准后执行的响应线程;

    展开全文
  • 一、CountDownLatch  jdk提供的一个同步辅助类,在完成一组在在其他线程中执行的操作前,允许一个或者多个其他的线程等待,...二、计算多个线程执行时间 package com.example.demo.juc; import java.util....

    一、CountDownLatch

      jdk提供的一个同步辅助类,在完成一组在在其他线程中执行的操作前,允许一个或者多个其他的线程等待,通过调用 await() 方法阻塞,直到由于 countDown() 方法的调用而导致当前计数达到零,之后所有等待线程被释放。

    二、计算多个线程执行时间

    package com.example.demo.juc;
    
    import java.util.concurrent.CountDownLatch;
    
    /**
     * @author DUCHONG
     * @since 2019-01-17 14:18
     **/
    public class LatchTest {
    
        public static void main(String[] args) {
    
            Long startTime=System.currentTimeMillis();
            CountDownLatch countDownLatch=new CountDownLatch(5);
            LatchThread latchThread=new LatchThread(countDownLatch);
    
            for(int j=1;j<=5;j++){
                new Thread(latchThread,"thread"+j).start();
            }
    
            try {
                countDownLatch.await();
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            Long endTime=System.currentTimeMillis();
    
            System.out.println("over 耗时:"+(endTime-startTime));
        }
    
    }
    
    class LatchThread implements  Runnable{
    
        private CountDownLatch latch;
        public LatchThread(CountDownLatch l) {
            latch=l;
        }
    
        @Override
        public void run() {
            synchronized (this) {
                try {
                    for (int i = 0; i < 100; i++) {
                        if (i % 2 == 0) {
                            System.out.println(Thread.currentThread().getName() + "----" + i);
                        }
                    }
                }
                finally {
                    latch.countDown();
                }
            }
        }
    }
    

     

    转载于:https://www.cnblogs.com/geekdc/p/10282177.html

    展开全文
  • java -3线程调度

    2018-12-28 20:50:07
    线程调度 ...分时调度模型 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片 抢占式调度模型 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优...

    线程调度

    假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是使用权,才可以执行指令。那么Java是如何对线程进行调用的呢?

    线程有两种调度模型:

    分时调度模型 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
    抢占式调度模型 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。
    Java使用的是抢占式调度模型。

    设置和获取线程优先级

    public final int getPriority()
    public final void setPriority(int newPriority)
    

    注意:
      线程默认优先级是5。
      线程优先级的范围是:1-10。
      线程优先级高仅仅表示线程获取的 CPU时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到比较好的效果。

    public static void main(String[] args) {
    
            // 创建两个线程对象
    		ThreadPriority tp1 = new ThreadPriority();
    		ThreadPriority tp2 = new ThreadPriority();
    		ThreadPriority tp3 = new ThreadPriority();      
            //调用方法设置线程名称
    		tp1.setName("东方不败");
    		tp2.setName("岳不群");
    		tp3.setName("林平之");      
            //获取默认优先级   结果都是5,证明系统默认的线程优先级是5
    		System.out.println(tp1.getPriority());
    		System.out.println(tp2.getPriority());
    		System.out.println(tp3.getPriority());
            
            //设置线程优先级  
            //数字越大的优先级越高。但是,优先级高只是意味着该线程获取的 CPU 时间片相对多一些。并不是说是先让你走完。
            tp1.setPriority(1);
            tp2.setPriority(6);
            tp3.setPriority(10);
            
            
            tp1.start();
            tp2.start();
            tp3.start();
            
        }
    
    展开全文
  • 线程进程和线程的区别串行:初期的计算机只能串行执行任务,大量时间等待用户输入批处理:预先将用户的指令集中成清单,批量串行处理用户指令,仍然无法并发执行进程:进程独占内存空间,保存各自运行状态,互相之间...

    线程

    进程和线程的区别

    串行:初期的计算机只能串行执行任务,大量时间等待用户输入

    批处理:预先将用户的指令集中成清单,批量串行处理用户指令,仍然无法并发执行

    进程:进程独占内存空间,保存各自运行状态,互相之间不相互干扰,为并发处理任务提供了可能、

    线程:共享进程的内存资源,相互间切换状态,支持更细细度的控制

    进程是资源分配的最小单位,线程是CPU资源分配的基本单位

    所有与进程相关的资源,都被记录在PCB中

    进程是抢占处理机的调度单位;线程属于某个进程,共享其资源

    线程只有堆栈寄存器、程序计数器和TCB组成

    81c414efbb10a45577aa9eda655a727f.png

    3e604245e511cdbe5b933a92509ba84d.png

    线程不能看做独立的应用,而进程可以看做独立的应用

    进程有独立的地址空间,相互之间不影响,线程只是进程的不同执行路径

    线程没有独立的地址空间,多进程的程序比多线程的程序更加健壮

    进程的切换比线程的切换开销大

    Java进程和线程的关系

    Java对操作系统提供功能的封装,包含进程和线程

    运行一个程序会产生一个进程,进程至少包含一个线程

    每个进程对应一个JVM实例,多个线程共享JVM里的堆

    Java采用单线程模型编程,程序会自动创建主进程

    Sleep和Wait的区别

    sleep是Thread类的方法,wait是Object类定义的方法

    sleep可以在任何方法中使用,wait方法需要获取到锁才能使用也就是sychronized中使用

    主要区别

    sleep会让出CPU,不会导致锁行为的改变

    Object.wait不仅会让出锁,还会释放同步资源

    synchronized底层实现原理

    Monitor:每个Java对象天生有个Monito锁

    Monitor锁的竞争和释放

    c2413555b0d6b768ef050aa8b520c81a.png

    早期版本的synchronized使用操作系统的Mutex Lock;

    用户态切换到系统态很慢

    自旋锁与自适应锁

    自旋锁

    许多情况下,共享资源占用的时间是很短的,切换线程不值得

    通过让线程执行忙循环等待锁的释放,不让出CPU

    缺点:如果线程占用锁的时间过长,会带来性能上的开销

    自适应锁

    自旋的次数不在固定

    由前一次在同一个锁上的自旋次数及锁拥有者的状态来决定

    锁消除

    在JIT期间,消除程序中不可能出现锁竞争代码锁申请的锁

    锁粗化

    消除对同一方法中同时多次加锁

    锁膨胀

    无锁→偏向锁→轻量锁→重量锁

    一般情况下是不可退化的

    偏向锁

    核心思想:

    ​如果一个线程获得了锁,锁进入偏向模式,此时Mark Word的结构也变为偏向结构,当该线程再次请求锁时,无需在做任何同步操作,即获取锁的过程中只需要检查Mark Word的锁标记位为偏向锁以及当前线程的ID等于Mark Word的Thread ID即可,可以省去大量申请锁的时间

    轻量锁

    核心思想:

    ​轻量级锁是有偏向锁膨胀而来,在一个线程进入同步块的情况下,另外一个线程也进入同步块,发生锁争用就会转为轻量级锁

    若存在多个线程竞争同步块,会膨胀为重量锁

    优点

    缺点

    使用范围

    偏向锁

    加锁和解锁不需要采用CAS操作,没有额外的性能消耗,和执行非同步方法相比仅差纳秒级

    如果线程之间存在锁的竞争,会带来额外的消耗

    只有一个线程访问同步块或者同步代码的情况

    轻量锁

    竞争的线程不阻塞,提高了响应速度

    若线程长时间抢不到锁,自旋会影响CPU性能

    线程交替执行同步代码或者同步方法的情况

    重量锁

    线程竞争不会自旋,不会消耗CPU

    线程阻塞,响应时间缓慢,在多线程的情况下,频繁的获取释放锁,会带来巨大的性能消耗

    追求吞吐量,同步块或者同步时间较长的场景

    锁的内存定义

    ​当线程释放锁时,Java内存模型会把线程对应的本地内存变量刷新到主内存中

    ​而当线程获取锁时,Java内存模型会把线程获取的主内存空间设置为无效,从而使得被监视器保护的临界区代码必须从主内存中读取共享变量

    ..%5Cmg%5C1550988650528.png

    展开全文
  • java线程知识

    2019-06-21 21:48:32
    描述 1.匿名对象没有对象名,对...(CPU只是将时间切割为时间片,然后将时间片分配给这些线程,CPU高速计算能力,给人感觉多各线程同时执行)。 4. 进程中所有线程共享进程的虚拟地址空间。 Java实现多线程的,有2个方法...
  • Java线程

    2020-05-17 21:26:09
    分时调度:所有线程轮流使用CPU的使用权 抢占式调度:优先让优先级高的线程使用CPU 多线程的运行原理 主线程开始,new的时候,开辟新的栈空间,执行run方法,之间互不影响,抢占Cpu的使用权。J.
  • 线程调度   1、问题引入 (1)假如我们的计算机只有一个 CPU,...分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片。 抢占式调度模型:优先让优先级高的线程使用 CPU,如果...
  • Java-多线程思想

    2018-08-26 11:43:24
    一、序言 在过去单 CPU 时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行...随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的 CPU 时间所有的内存和...
  • 一个进程可以包含多个线程,同一个进程中的所有线程共享该进程的资源。 java平台中的一个线程就是一个对象。增加线程可能会增加单位时间内完成的任务量,即提高程序的计算效率;但也有可能降低程序的计算效率。 ...
  • 一个应用程序可以同时启动多个进程(比如浏览器可以开多个窗口,每个窗口就是一个进程)多进程操作系统能够运行多个进程,每个进程都能够循环利用所需要的CPU时间片,使的所有进程看上去像在同时运行一样。线程是进程...
  • Java进程与线程的区别

    2019-08-04 22:03:01
    进程:最开始计算机发展时期,所有的指令都是串行执行,如果遇到用户IO指令,则系统等待用户IO完成之后继续执行指令,极大的浪费CPU时间,为缓解该情况了,引入了指令集的概念,把需要执行的指令都写到一个磁盘上,...
  • java线程

    2017-09-10 16:58:32
    线程概述多任务操作系统,即能够同时执行多个应用程序,最常见的有 Windows、Linux...在计算机中,所有的应用程序都是由 CPU 执行的,对于一个 CPU 而言,在某个时间点只能运行一个程序,即只能执行一个进程。由于 CPU
  • 通常操作系统在管态下运行,可以执行所有机器指令;而用户程序在目态下运行,只能执行非特权指令。如果用户程序企图在目态下执行特权指令,将会引起保护性中断,由操作系统终止该程序的执行,从而...
  • java 线程知识考点

    2020-06-14 11:19:24
    java 线程知识考点 1 进程和线程的区别 1.1 进程和线程的由来 串行:初期计算机智能串行执行任务,并且需要长时间等待用户输入。 批处理:预先将用户的指令集中成清单,批量串行执行用户指令,任然无法并发...
  • 并发:两个或多个事件在同一时间段内发生【多个任务交替执行】 并行:两个或多个事件在同一时刻发生【多个任务同时执行】 进程:进入内存的程序 内存:所有应用程序都要进入到内存中执行 临时存储RAM 线程:进程的一...
  • Java线程的调度

    2018-05-27 23:08:10
    程序中的多个线程,是并发执行的 某个线程如果想要被执行,必须得到CPU的使用权 ...是指让所有线程,轮流获得CPU的使用权,并且,平均分配每个线程占用的CPU的时间片 抢占式调度模型 是指让可运行池中,优...
  • 线程调度  假如我们的计算机只有一个 CPU,那么 ...分时调度模型 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片 抢占式调度模型 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么...
  • 什么是并发 在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间...随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的CPU时间所有的内存和其他计算机...
  • 线程概要 Java

    2019-03-13 18:01:00
    串行:初期的计算机只能串行执行任务,大量时间等待用户输入 批处理:预先将用户的指令集中成清单,批量串行处理用户指令,仍然无法并发执行 进程:进程独占内存空间,保存各自运行状态,互相之间不相互干扰,为并发...
  • JAVA-关于多线程

    2019-11-21 23:03:59
    具有多线程能力的计算机因为硬件上的支持,能够在同一个时间执行多于一个的线程,进而提升整体的处理性能。 2.多线程的作用: 多线程只有一个目的,那就是更好的利用CPU的资源,所有的多线程都可以用单线程来实现。 ...
  • Java基础之多线程

    2019-10-24 17:55:11
    线程是指在软件或硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因为有硬件支持而使其能够在同一时间执行多个线程,进而提升整体的处理性能.本章将针对多线程进行详细讲解. 线程概述 在学习线程...
  • java线程机制

    千次阅读 2016-01-10 15:39:13
    大部分操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。 多任务运行过程的示意图如下: 1.1操作...
  • java线程与并发原理

    2020-05-19 02:14:59
    三、java线程与并发原理 1.进程和线程的区别: 进程和线程的由来: (1)串行:初期的计算机只能串行执行任务,并且需要长时间等待用户输入; (2)批处理:预先将用户的指令集集中成清单,批量串行处理用户指令,...
  • 在计算机中,所有的应用程序都是由cpu执行的,对于一个cpu而言,在某个时间点只能运行一个程序,也就是说只能执行一个进程。操作系统会为每个进程分配一段有限的cpu使用时间,cpu在这段时间执行某个进程,然后会...
  • 最近恰好有点时间看《Java并发编程实践》,以前没有写过博客,顺手写一下笔记和自己的感悟。 目录 目录 简介 并发简史 线程的优势 线程的风险 线程安全性 什么是线程安全性 简介 并发简史 ...
  • 计算机没有严格意义上的同时程序:计算机硬盘上存放的一段代码,不运行进程:一个程序就是一个进程,一个进程只有当所有线程终止时才会停止线程:一个进程可以包含多个线程,至少包含一个如何实现多线程:1、自定义...
  • java并发与多线程教程

    2016-04-08 17:59:47
    Java并发性与多线程介绍 在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 287
精华内容 114
关键字:

java计算所有线程执行时间

java 订阅