线程

Java 线程与多线程

对着背影说爱祢 提交于 2020-03-22 17:46:55
Java是一门支持多线程的编程语言! 什么是进程? 计算机中内存、处理器、IO等资源操作都要为进程进行服务。 一个进程上可以创建多个线程,线程比进程更快的处理单元,而且所占用的资源也小,多线程的应用也是性能最高的。 Java的多线程实现:(三种方式)   在Java中实现多线程有两种途径:     1、继承Thread类     2、实现Runnable接口     3、实现Callable接口 继承Thread类: class MyThread extends Thread { //继承Thread 即 多线程类【线程操作主类】 } ps:在Java中,任何一个类继承了Thread类,都视为该类为多线程类。 在Java程序中都有一个“起点”即开始的地方;那么多线程类也有一个“起点”—— run()方法 ,也就是说在多线程的每个主体类中都必须要覆写Thread类中所提供的 run() 方法 public void run() ; run()方法没有提供参数和返回值,那么也就表示了线程一旦开始就要一直执行,不能够返回内容。 import sun.security.mscapi.KeyStore.MY; class MyThread extends Thread { //继承Thread 即 多线程类 private String name ; public MyThread

CUDA ---- 简介

那年仲夏 提交于 2020-03-22 15:12:39
CUDA简介 CUDA是并行计算的平台和类C编程模型,我们能很容易的实现并行算法,就像写C代码一样。只要配备的NVIDIA GPU,就可以在许多设备上运行你的并行程序,无论是台式机、笔记本抑或平板电脑。熟悉C语言可以帮助你尽快掌握CUDA。 CUDA编程 CUDA编程允许你的程序执行在异构系统上,即CUP和GPU,二者有各自的存储空间,并由PCI-Express 总线区分开。因此,我们应该先注意二者术语上的区分: Host:CPU and itsmemory (host memory) Device: GPU and its memory (device memory) 代码中,一般用h_前缀表示host memory,d_表示device memory。 kernel是CUDA编程中的关键,他是跑在GPU的代码,用标示符__global__注明。 host可以独立于host进行大部分操作。当一个kernel启动后,控制权会立刻返还给CPU来执行其他额外的任务。所以,CUDA编程是异步的。一个典型的CUDA程序包含由并行代码补足的串行代码,串行代码由host执行,并行代码在device中执行。host端代码是标准C,device是CUDA C代码。我们可以把所有代码放到一个单独的源文件,也可以使用多个文件或库。NVIDIA C编译器(nvcc

Java JVM 相关基础知识

别来无恙 提交于 2020-03-22 13:35:00
1.JMM Java内存模型 每条线程都有自己的工作内存[Working Memory] 线程的工作内存保存了被该线程使用的变量的主内存副本拷贝 线程对变量的所有线程之间也无法直接访问对方工作内存的变量,线程间变量值的传递均需要通过主内存来完成。 2.java的堆和栈 1)堆 heap:可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护);     其中的内存在不需要时可以回收,以分配给新的内存请求,其 内存中的数据是无序的 ;     一般由使用者自由分配,malloc 分配的就是堆,需要手动释放;     被所有线程共享的一块内存区域,在虚拟机启动时创建, 此内存区域的唯一目的就是存放对象实例 。 2)栈 stack:先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量.;     在 java 中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前 scopes 内(就是由{...}括起来的区域);      先分配的内存必定后释放 ;     一般由系统自动分配,存放函数的参数值,局部变量等,自动清除 3.方法区 本地方法栈 1)方法区 Method Area:和Java 堆一样,别名叫做 Non-Heap(非堆),是各个线程共享的内存区域;           它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

C# 线程 基本同步

那年仲夏 提交于 2020-03-22 12:49:59
第二部分: 基本同步 同步要点 到目前为止,我们已经描述了如何在线程上启动任务,配置线程以及双向传递数据。我们还描述了局部变量如何专用于线程,以及如何在线程之间共享引用,从而允许它们通过公共字段进行通信。 下一步是同步:协调线程的动作以实现可预测的结果。当线程访问相同的数据时,同步特别重要。在该区域搁浅非常容易。 同步构造可以分为四类: 简单的组织方法 它们等待另一个线程完成或等待一段时间。 Sleep,Join和Task.Wait是简单的阻止方法。 锁定构造 这些限制了可以一次执行某些活动或一次执行一段代码的线程数。排它锁定结构是最常见的-一次仅允许一个线程,并且允许竞争线程访问公共数据而不会互相干扰。标准的排他锁定结构是锁(Monitor.Enter / Monitor.Exit),互斥锁和SpinLock。非排他的锁定构造是Semaphore,SemaphoreSlim和读取器/写入器锁定 信号结构 这些允许线程暂停,直到接收到来自另一个线程的通知为止,从而避免了无效的轮询。常用的信号设备有两种:事件等待句柄和监视器的等待/脉冲方法。 Framework 4.0引入了CountdownEvent和Barrier类。 非阻塞同步构造 这些通过调用处理器原语来保护对公共字段的访问。 CLR和C#提供以下非阻塞构造:Thread.MemoryBarrier,Thread

GIL全局解释器锁

我只是一个虾纸丫 提交于 2020-03-22 05:11:00
GIL介绍 GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全 如果多个线程的target=work,那么执行流程是: 多个线程先访问到解释器的代码,即拿到执行权限,然后将target的代码交给解释器的代码去执行 解释器的代码是所有线程共享的,所以垃圾回收线程也可能访问到解释器的代码而去执行,这就导致了一个问题:对于同一个数据100,可能线程1执行x=100的同时,而垃圾回收执行的是回收100的操作,解决这种问题没有什么高明的方法,就是加锁处理,如下图的GIL,保证python解释器同一时间只能执行一个任务的代码 GIL与Lock GIL 与Lock是两把锁,保护的数据不一样,前者是解释器级别的(当然保护的就是解释器级别的数据,比如垃圾回收的数据),后者是保护用户自己开发的应用程序的数据,很明显GIL不负责这件事,只能用户自定义加锁处理,即Lock,如下图 分析: 1、100个线程去抢GIL锁,即抢执行权限 2、肯定有一个线程先抢到GIL(暂且称为线程1),然后开始执行,一旦执行就会拿到lock.acquire() 3、极有可能线程1还未运行完毕,就有另外一个线程2抢到GIL,然后开始运行,但线程2发现互斥锁lock还未被线程1释放,于是阻塞,被迫交出执行权限,即释放GIL 4

WORD文档转换成PDF格式

别说谁变了你拦得住时间么 提交于 2020-03-22 04:52:12
(来源网络)   前言:由于一个客户的项目中需要将WORD文档转换成PDF格式,故写了本篇实站教程   需求分析:客户的项目以B/S结构为主,提供一个WORD文件在后台自动转换成PDF,经过实际测试,如果该篇WORD文档有100多页的话,转换需要20分钟左右的时间(环境:CPU是奔腾M 1.6G,512M内存),整个CPU的占用率近乎95%~100%,此结果告诉客户以后,客户提议:到客户下班后,自动转换PDF,同时如果使用人确认要查看该PDF文档,如果没有转换,提供给客户选择,是现在转换成PDF,还是由服务器在客户下班后,自动转换。   项目功能:按需求分析要写两个功能   第一为:B/S结构后台转换,要提交给客户选择   第二为:Windows服务自动转换WORD文档到PDF   这两个分类:核心的转换程序都是采用线程的方式执行,只不过第一个功能是针对一个WORD文件,第二个功能针对所有未转换的WORD文档.   分析到现在:我们开始实战转换了!    一:必备工具   安装必须的工具MS VS.Net2003,MS Office2003,Adobe Acrobat 7.0 Professional,postscript.exe,gs811w32.exe   MS VS.Net2003的安装不说明   MS Office2003的安装不说明   Adobe Acrobat 7.0

说说Java中的那些锁

自闭症网瘾萝莉.ら 提交于 2020-03-22 03:54:22
  在学习Java锁的时候,总觉的比较含糊,感觉一直没有系统的消化理解。所以决定重新梳理一下java相关的锁。     本质来说只有两种锁,乐观锁和悲观锁,其他所谓的可重入、自旋、偏向/轻量/重量锁等,都是锁具有的一些特点或机制。目的就是在数据安全的前提下,提高系统的性能。 乐观锁    乐观锁,顾名思义,就是说在操作共享资源时,它总是抱着乐观的态度进行,它认为自己可以成功地完成操作。但实际上,当多个线程同时操作一个共享资源时,只有一个线程会成功,那么失败的线程呢?它们不会像悲观锁一样在操作系统中挂起,而仅仅是返回,并且系统允许失败的线程重试,也允许自动放弃退出操作。所以,乐观锁相比悲观锁来说,不会带来死锁、饥饿等活性故障问题,线程间的相互影响也远远比悲观锁要小。更为重要的是,乐观锁没有因竞争造成的系统开销,所以在性能上也是更胜一筹。   CAS 是实现乐观锁的核心算法,它包含了 3 个参数:V(需要更新的变量)、E(预期值)和 N(最新值)。只有当需要更新的变量等于预期值时,需要更新的变量才会被设置为最新值,如果更新值和预期值不同,则说明已经有其它线程更新了需要更新的变量,此时当前线程不做操作,返回 V 的真实值。    如何实现原子操作   在 JDK 中的 concurrent 包中,atomic 路径下的类都是基于 CAS 实现的。AtomicInteger 就是基于

黑马程序员——对线程的一些总结

一个人想着一个人 提交于 2020-03-22 03:30:15
1.为什么要覆盖run()方法? Thread类用于描述线程。该类就定义了一个功能,即存储线程要运行的代码,该存储的功能就是由run()方法来实现的。 2.线程的运行状态: 线程被创建,调用start()方法进入运行状态;如果调用sleep(time)或者wait()方法线程进入冻结状态,但依然存在,此时可以试用notify()方法唤醒线程; 当线程运行结束或者调用stop()方法,线程便消亡了。 3.关于多线程的安全问题 解决方式:对多条操作共享数据的语句,只能让一个线程执行完毕之后,在执行过程中其他线程不可参与。 即同比代码块:synchronized(对象){需要同步的代码} 上面的对象其实就是锁,持有锁的线程才可以执行同步代码块中的代码,没有持有锁的的线程即使获取了cpu执行权也进不去,因为没有获得锁对象 同步的前提:有两个或者两个以上的线程 必须多个线程使用同一个锁对象 4.如何看哪些代码需要同步? 明确哪些代码是多线程运行代码 明确哪些是共享数据 明确多线程运行代码中哪些语句操作共享数据 来源: https://www.cnblogs.com/wdsthink/p/4372896.html

不可思议的OOM

无人久伴 提交于 2020-03-22 03:10:17
本文发现了一类OOM(OutOfMemoryError),这类OOM的特点是崩溃时java堆内存和设备物理内存都充足,下文将带你探索并解释这类OOM抛出的原因。 关键词: OutOfMemoryError, OOM,pthread_create failede, Could not allocate JNI Env 一、引子 对于每一个移动开发者,内存是都需要小心使用的资源,而线上出现的 OOM(OutOfMemoryError)都会让开发者抓狂,因为我们通常仰仗的直观的堆栈信息对于定位这种问题通常帮助不大。网上有很多资料教我们如何“紧衣缩食“的利用宝贵的堆内存(比如,使用小图片,bitmap 复用等),可是: 线上的 OOM 真的全是由于堆内存紧张导致的吗? 有没有 App 堆内存宽裕,设备物理内存也宽裕的情况下发生 OOM 的可能? 内存充裕的时候出现 OOM 崩溃? 看似不可思议,然而,最近笔者在调查一个问题的时候,通过自研的 APM 平台发现公司的一个产品的大部分 OOM 确实有这样的特征,即: OOM 崩溃时,java 堆内存远远低于 Android 虚拟机设定的上限,并且物理内存充足,SD 卡空间充足 既然内存充足,这时候为什么会有 OOM 崩溃呢? 二、问题描述 在详细描述问题之前,先弄清楚一个问题: 什么导致了 OOM 的产生? 下面是几个关于 Android

Quartz动态改变任务时间

℡╲_俬逩灬. 提交于 2020-03-22 02:15:18
基于quartz-2.2 的动态任务调度 Quartz是一个完全由java编写的开源作业调度框架。 调度器 Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。Quartz依赖一套松耦合的线程池管理部件来管理线程环境。 今天测试了下基于quartz-2.2动态改变调度时间 <bean id="producer" class="com.springmvc.controller.Producer" /> <bean id="schedulerJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="producer"/> <property name="targetMethod" value="executeListener"/> <property name="concurrent" value=