多线程
努力努力再努力@x
这个作者很懒,什么都没留下…
展开
-
多线程BlockingQueue模拟生产者与消费者
和我之前的例子一样,直接上源码:package com.newDemo.controller.test;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.TimeUnit;import java.uti...原创 2019-12-20 09:19:26 · 147 阅读 · 0 评论 -
java并发包Semaphore信号量
Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的事情后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建计数为1的Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。它的用法如下:availablePermits函数用来获取...原创 2019-12-19 17:40:10 · 216 阅读 · 0 评论 -
java并发包CyclicBarrier
CyclicBarrier初始化时规定一个数目,然后计算调用了CyclicBarrier.await()进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。CyclicBarrier初始时还可带一个Runnable的参数, 此Runnable任务在Cyclic...原创 2019-12-19 16:36:05 · 158 阅读 · 0 评论 -
java并发包CountDownLatch
CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。这里举个例子:比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。代码如下:package com.newDemo.controller.test;import java.util.concurrent.Co...原创 2019-12-19 16:07:24 · 129 阅读 · 0 评论 -
多线程ThreadLocal
什么是多线程ThreadLocaThreadLocal提供一个线程的局部变量,访问某个线程拥有自己局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。简单的一句话:就是它让变量不会共享,每个线程都有各自的变量。ThreadLoca方法如下:1.void ...原创 2019-12-19 11:55:03 · 184 阅读 · 0 评论 -
如何停止线程?
停止线程思路使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。使用interrupt方法中断线程。(表示让当前等待的线程直接抛出异常)代码如下:package com.newDemo.controller.test;class stopThr...原创 2019-12-19 11:18:28 · 80 阅读 · 0 评论 -
Lock 接口与 synchronized 关键字的区别
Lock 接口与 synchronized 关键字的区别Lock 接口可以尝试非阻塞地获取锁 当前线程尝试获取锁。如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁。Lock 接口能被中断地获取锁 与 synchronized 不同,获取到锁的线程能够响应中断,当获取到的锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。Lock 接口在指定的截止时间之前获取锁,如果截止时间到了依旧...原创 2019-12-19 10:50:13 · 101 阅读 · 0 评论 -
多线程Lock锁实现线程同步
在之前的文章中,使用synchronized同步代码块, wait(); notify();解决了线程同步问题,那么除了这个办法,还可以使用lock锁。还是之前的例子:lock用法如下:Lock lock = new ReentrantLock();lock.lock();try{//可能会出现线程安全的操作}finally{//一定在finally中释放锁//也不能把获取锁在t...原创 2019-12-19 10:45:27 · 669 阅读 · 0 评论 -
多线程wait()和sleep()的区别
多线程wait()和sleep()的区别wait()位于同步中,可以释放锁的资源sleep()不是释放锁的资源wait需要notify才能从休眠状态变为运行状态,sleep到期之后,会自动从休眠状态变为运行状态。官方话语如下对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。sleep()方法导致了程序暂停执行指定的...原创 2019-12-18 18:54:59 · 112 阅读 · 0 评论 -
多线程之间实现通讯
多线程之间如何实现通讯什么是多线程之间通讯?多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。画图如下:我这里有个例子:就是弄两个线程,一个进行写,一个进行读,写的话,如果是偶数,就是java,男。如果是奇数,就是php 女,。代码如下:package com.newDemo.controller.test;//共享资源class res{ public ...原创 2019-12-18 18:39:23 · 282 阅读 · 0 评论 -
volatile与synchronized区别
仅靠volatile不能保证线程的安全性。(原子性)①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢...原创 2019-12-18 16:55:06 · 65 阅读 · 0 评论 -
多线程AtomicInteger原子类
我的上一篇博文讲到了,Volatile不能保证原子性,代码如下:package com.newDemo.controller.test;import java.util.concurrent.atomic.AtomicInteger;public class threadDemo15 extends Thread { private volatile static int coun...原创 2019-12-18 16:42:15 · 119 阅读 · 0 评论 -
多线程Volatile关键字详解
Volatile 关键字的作用是变量在多个线程之间可见。但是不保证线程的原子性。下面我就写个例子来证明一下volatilepackage com.newDemo.controller.test;class VolatileDemo extends Thread{ public boolean flag = true; public void run(){ System.out.p...原创 2019-12-18 15:44:44 · 149 阅读 · 0 评论 -
java内存模型
java内存模型和java内存结构是2个概念,大家一定要分清了这里我先复制网上的一段话,如下:共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储...原创 2019-12-18 11:55:51 · 90 阅读 · 0 评论 -
多线程三大特性
多线程三大特性原子性可见性有序性原子性独一无二,一致性,保证线程安全问题即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。一个很经典的例子就是银行账户转账问题:比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。这2个操作必须要具备原子性才能保证不出现一些意外的问题。我们操作数据也是如此,...原创 2019-12-18 11:12:18 · 85 阅读 · 0 评论 -
多线程死锁
多线程死锁是什么?就是同步中嵌套同步,无法释放锁,导致程序一直等待下面就是代码,我们模拟一段死锁现象package com.newDemo.controller.test;class trainDemo14 implements Runnable{ /** * 当一个变量被static修饰时,就会放到jvm的方法区,当class文件被加载的时候就会初始化 */ private...原创 2019-12-18 10:54:15 · 104 阅读 · 0 评论 -
多线程静态同步函数
多线程静态同步函数和非静态同步函数的区别是啥?静态同步函数:就是方法使用了static关键字修饰非静态同步函数:没有用static关键字修饰的方法,也就是使用this锁的同步函数那么静态同步函数使用的啥锁呢?分析:两个线程,一个线程使用静态同步函数,一个使用同步代码块this锁,如果线程不同步(线程不安全),就说明静态同步函数使用的不是this锁,如果线程同步,就说明使用的是this锁。...原创 2019-12-17 20:45:16 · 291 阅读 · 0 评论 -
多线程安全问题
什么是线程安全问题?当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会受到其他线程的干扰,会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。案例分析需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。分析就是说两个窗口要同时买票,但是不能重复,总票数100张,不能卖同一张,卖完为止。代码如下:package com.n...原创 2019-12-17 19:58:04 · 241 阅读 · 0 评论 -
多线程模拟发送短信
现在有个需求,5分钟之内发送通知短息给12000个人,假设用多线程发的话,最好根据cpu的性能,确定线程数,每个线程发送2000个人的短信,那么这个例子如下:有三个类,一个用户类,一个工具类,一个发送类package com.newDemo.controller.sendmq;public class UserEntity { private String userId; priv...原创 2019-12-17 10:28:39 · 1364 阅读 · 2 评论 -
现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行
这个是多线程经常会遇到的面试题,其实这个我们分析一下,无非就是在t2线程里面申明t1.join(),在t3线程里面t2.join();这样就可以了package com.newDemo.controller.test;public class threadDemo7 { public static void main(String[] args) throws InterruptedEx...原创 2019-12-16 18:29:24 · 805 阅读 · 0 评论 -
多线程join方法
join作用是让其他线程变为等待, t1.join();// 让其他线程变为等待,直到当前t1线程执行完毕,才释放。thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。需求:有两个线程,主线程和子线程,这里要让子线程执行完毕之后,再让主线程执行,这个时候代码如...原创 2019-12-16 18:12:43 · 213 阅读 · 0 评论 -
线程和进程
由于各种原因,最近准备深入研究一下多线程,注意,是深入,本人的学习路径也是从我的博文中可以提现出来,大家都可以借鉴和学习。先来聊聊基本的知识点线程与进程为什么要使用多线程?多线程应用场景线程和进程进程:每个正在系统上运行的程序都是一个进程。它是线程的集合。(一个程序可能有多个进程)线程:正在独立运行的一条执行路径。可以打开自己的任务管理器看进程。以下内容是我从书上摘抄过来的,可以...原创 2019-12-16 12:26:55 · 81 阅读 · 0 评论 -
多线程运行状态
面试的时候,经常会有面试官问到多线程的状态有哪些,分别是啥,简述一下,这个时候,我们要知道 。线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。针对每一个状态,其实我自己也画图,如下:新建状态当用new操作符创建一个线程时, 例如new Thread®,线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始...原创 2019-12-16 17:51:15 · 141 阅读 · 0 评论 -
守护线程和非守护线程
Java中有两种线程,一种是用户线程,另一种是守护线程。用户线程:指用户自定义创建的线程,主线程停止,用户线程不会停止(和主线程互不影响)守护线程 :当进程不存在或主线程停止,守护线程也会被停止。(gc就是守护线程)(和主线程一起销毁)使用setDaemon(true)方法设置为守护线程下面的这个例子可以通过setDaemon(true)方法来体现出守护线程和非守护线程的区别。packa...原创 2019-12-16 17:28:36 · 100 阅读 · 0 评论 -
多线程常用api
常用线程api方法start() 启动线程currentThread() 获取当前线程对象getID() 获取当前线程ID Thread-编号 该编号从0开始getName() 获取当前线程名称sleep(long mill) 休眠线程Stop() 停止线程,常用线程构造函数Thread() ...原创 2019-12-16 16:53:36 · 408 阅读 · 0 评论 -
多线程创建方式
在企业的开发当中,经常会用到多线程,比如异步上传,抢票啊,对接过百度bos的小伙伴知道,在bos当中,分块上传,断点续传,也是用多线程开发,实现多线程主要有以下几种方式继承Thread类 重写run方法实现Runnable接口,重写run方法使用匿名内部类方式继承Thread类 重写run方法;实现Runnable接口,重写run方法;使用匿名内部类方式;java1.5并发包里面的cal...原创 2019-12-16 15:45:28 · 75 阅读 · 0 评论 -
同步和异步
多线程中同步和异步的区别是啥?同步就是:代码从上往下有顺序的执行,就是单线程的执行过程。异步就是:代码不必遵守从上到下的执行,就是多线程的执行过程,每个互不影响。...原创 2019-12-16 15:22:18 · 90 阅读 · 0 评论