![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
Arno-wei
你所谓的迷茫不过是清醒的看着自己沉沦
展开
-
Java多线程和线程池
1.为什么要使用线程池在java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。为了防止资源不足,服务转载 2018-01-24 16:05:05 · 109 阅读 · 0 评论 -
线程一1.0 线程的通信--单线程间的通信
一 同步阻塞和异步非阻塞如果有这样一个功能,客户端提交event至服务器,服务器接收到客户请求之后开辟线程处理客户请求,进过处理后将结果返回给客户端,如下图:这有几个问题:、同步Event提交,客户端等待时间过长,会陷入阻塞。导致第二次提交Event耗时过长;客户端提交的Event数量不多,导致系统同事受理的业务数量有限,也就是系统整体的吞吐量不高。这种一个线程处理一个E...原创 2019-03-13 10:31:40 · 184 阅读 · 0 评论 -
线程一1.0 线程 线程池
自打jdk1.5起。utils包就提供了ExecutorService线程池的实现,主要为了重复利用线程,thread是一个重量级的资源,重复的创建,销毁,启动,都是比较耗费资源的,系统可以创建的线程也是有限的,所以重复利用的线程池应运而生一 线程池的原理线程池就是一个盛放创建好的线程的池子,当有任务提交给线程池执行的时候。池子中的某个线程就会主动执行该任务。如果池子中的线程数量...转载 2019-03-21 09:29:52 · 329 阅读 · 0 评论 -
线程一1.0 线程 类加载简介
1. jvm运行时内存结构划分在正式介绍之前,先看看jvm内存结构划分:结合垃圾回收机制,将堆细化:在加载阶段主要用到的是方法区:方法区是可供各条线程共享的运行时内存区域。存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容、还包括一些在类、实例、接口初始化时用到的特殊方法。如果把方法的代码看作它...原创 2019-03-21 16:31:02 · 227 阅读 · 0 评论 -
线程一1.0 线程的通信--多线程间的通信
上面学了两个线程间的通讯,只有一个线程对Eventqueue进行offer操作,也只有一个线程对Eventqueue进行take操作,如果多个线程同时进行offer和take,那么上面程序就会出现问题,1notifyAll方法多线程通信需要用到object的notifyAll方法该方法和notify方法比较类似,都可以唤醒由于调用了wait方法而阻塞的线程,但是notify方法...原创 2019-03-13 11:32:14 · 157 阅读 · 0 评论 -
线程一1.0 线程 自定义显示锁BooleanLock
一定义Lock接口public interface Lock{void lock()throws InterruptedException;void lock(long mills)throws InterruptedException,TimeoutException;List<Thread>getBlockedThreads();}上述接口中:lock...原创 2019-03-18 14:15:43 · 173 阅读 · 0 评论 -
线程一1.0 线程 ThreadGroup
ThreadGroup和Thread 、在Java程序中,默认,新的线程会被加入main所在的group中,main线程的group名字同线程名,如同线程存在父子关系一样,threadgroup同样也存在父子关系,下图说明了父子thread,父子threadGroup以及thread和group之间的层次关系:无论如何线程都会被加入到某个threadgroup中。二:创建threa...原创 2019-03-18 17:20:41 · 234 阅读 · 0 评论 -
线程一1.0 线程 类的加载过程详解
看一下运行结果是什么,如果将2换到1的位置。输出是什么?一:类的加载阶段类的加载就是将class文件中的二进制数据读取到内存中,然后将该字节流所代表的静态存储结构转换为方法区中运行时的数据结构,并且在堆内存中生成一个该类的Java.lang.class对象,作为访问方法区数据结构的入口:类加载的最终产物就是堆内存中的class对象,对于同一个class loader来说,不管...原创 2019-03-22 14:51:53 · 283 阅读 · 0 评论 -
Java操作远程共享资源(JCIFS)
一、背景介绍1、有些需求中需要定时将信息写入到对方开发的共享文件夹中,这时就需要进行远程操作。2、这个使用需要对方共享文件夹开放对应的读写权限。3、这次用的是CIFS,通用Internet文件系统,在windows主机之间进行网络文件共享是通过使用微软公司自己的CIFS服务实现的。 二、实现逻辑1、共享的文件夹常见的有两种:访问时需要用户名+密码和访问时不需要文件名和密码,...转载 2019-03-19 08:52:47 · 2255 阅读 · 0 评论 -
线程一1.0 线程的synchronized
synchronized关键字可以实现一个简单的策略来防止线程干扰和内存一致性错误,如果一个对象对多个线程是可见的,那么对该对象的所有读或者写都将通过同步的方式来进行synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;2. 修饰一...转载 2019-03-12 15:00:30 · 90 阅读 · 0 评论 -
线程一1.0 线程的join
join 与sleep一样也是一个可中断的方法,如果有其他线程执行了对当前线程的interrupt操作,他也会捕获到中断信号,并且擦除interrupt标识, thread类为我们提供了三个不同的join 方法如下:一直搞不明白Java线程里的join()方法。API给出的解释是:Waits for this thread to die.那你为啥不叫die()或者waitToDie...原创 2019-03-11 17:03:11 · 106 阅读 · 0 评论 -
线程一1.0 线程的interrupt()、interrupted()和isInterrupted()。
一 interrupt :如下方法会使得当前线程进入阻塞状态:而调用当前线程的interrupt方法会打断阻塞:object的wait方法thread的sleep方法thread的join方法interruptiblechannel的io操作selector的wakeup方法其他方法上述若干方法都会是线程进入阻塞状态,若另外一个线程调用阻塞线程的interr...原创 2019-03-11 15:42:16 · 137 阅读 · 0 评论 -
java线程池ThreadPoolExecutor使用和分析(一)
线程池是可以控制线程创建、释放,并通过某种策略尝试复用线程去执行任务的一种管理框架,从而实现线程资源与任务之间的一种平衡。 以下分析基于 JDK1.7 以下是本文的目录大纲: 一、线程池架构 1、Executor接口 2、ExecutorService接口 3、ScheduledE转载 2018-01-24 16:16:26 · 232 阅读 · 0 评论 -
Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理
execute()是 java.util.concurrent.Executor接口中唯一的方法,JDK注释中的描述是“在未来的某一时刻执行命令command”,即向线程池中提交任务,在未来某个时刻执行,提交的任务必须实现Runnable接口,该提交方式不能获取返回值。下面是对execute()方法内部原理的分析,分析前先简单介绍线程池有哪些状态,在一系列执行过程中涉及线程池状态相关的判断。以下分转载 2018-01-24 16:31:18 · 298 阅读 · 0 评论 -
Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理
终止线程池主要有两个方法:shutdown() 和 shutdownNow()。 shutdown()后线程池将变成shutdown状态,此时不接收新任务,但会处理完正在运行的 和 在阻塞队列中等待处理的任务。 shutdownNow()后线程池将变成stop状态,此时不接收新任务,不再处理在阻塞队列中等待的任务,还会尝试中断正在处理中的工作线程。 下面是转载 2018-01-24 16:41:39 · 620 阅读 · 0 评论 -
线程池ThreadPoolExecutor与阻塞队列BlockingQueue应用
1.线程池介绍 JDK5.0以上: java.util.concurrent.ThreadPoolExecutor 构造函数签名:public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,转载 2018-01-24 19:09:19 · 539 阅读 · 0 评论 -
线程一1.0 线程 synchronized的缺陷
1一 synchronized的缺陷synchronized关键字提供了一种排他试的数据同步机制,某个线程在获取monitorlock的时候可能会被阻塞,而这种阻塞有两个很明显的缺陷,第一无法控制阻塞时长,第二:阻塞不可中断,如下:public class SynchnizedDefed { public synchronized void syncMethod(){ ...原创 2019-03-14 16:20:37 · 154 阅读 · 0 评论 -
线程一1.0 线程 获取线程的运行时异常,Hook线程
下图:线程在执行单元中是不允许抛出checked异常的,,而且线程运行在自己的上下文中,派生他的线程将无法直接获得它运行中出现的异常信息,对此Java给我们提供了一个uncaughtexceptionHandler接口,当线程在运行过程中出现异常时,就会回调UncaughtExceptionHandler接口,从而得知那个线程在运行中出错,以及出现了什么样的错误,如下public st...原创 2019-03-19 14:45:18 · 262 阅读 · 0 评论 -
线程一1.0 线程的sleep、wait、yield、interrupt
sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。通过调用sleep使任务进入休眠状态,在这种情况下,任务在指定的时间内不会运行。调用sleep的时候锁并没有被释放。休眠Java SE5引入了更加显示的sleep()版本作为TimeUnit类的一部分,这个方法允许你指定sleep(...原创 2019-03-11 11:34:31 · 126 阅读 · 0 评论 -
线程一1.0 线程的优先级
每个线程都有一个"优先级",优先级可以用整数表示,取值范围为0~10,0为最低优先级,10位最高优先级,当决定哪个线程需要调度时,首先查看是否存在优先级高的可调度线程,如果存在,就从中选择进行调度。当决定哪个线程需要调度时,首先查看是否存在优先级高的可调度线程,如果存在,就从中选择进行调度。当该线程的时间片到达之后,系统查看是否存在另一个优先级比较高的可调度线程,如果存在就调度。这样依次进行判断调...原创 2019-03-11 14:37:54 · 4551 阅读 · 1 评论 -
Java 并发:深入理解 ThreadLocal
ThreadLocal 又名线程局部变量,是 Java 中一种较为特殊的线程绑定机制,用于保证变量在不同线程间的隔离性,以方便每个线程处理自己的状态。进一步地,本文以ThreadLocal类的源码为切入点,深入分析了ThreadLocal类的作用原理,并给出应用场景和一般使用步骤。一. 对 ThreadLocal 的理解1). ThreadLocal 概述 ThreadLocal ...转载 2019-04-12 14:37:58 · 137 阅读 · 0 评论