线程

多线程(4)线程生命周期

寵の児 提交于 2020-04-02 14:00:12
多线程有六个状态 1.New(新创建) : 已创建但是还没有启动的新线程, new Thread()还没执行start() 2.Runnable( 可运行) :, 包括start()后等待运行和拿到资源运行中 3.Blocked(被阻塞) : synchronized修饰的代码没有拿到锁(monitor)陷入的等待状态。注意必须是synchronized修饰,其他的锁不是 4.Waiting(等待) : Object.wait(), Thread.join(), LockSupport.park()这三个没有timeout参数的方法会让线程进入等待状态. Object.notify()或者Object.notifyAll(), 等待join方法所运行的线程执行完毕, LockSupport.unpark() 会让等待的线程进入可运行状态 Lock.lock进入的是waiting状态而不是Blocked waiting和blocked的区别根本原因是“是不是内置锁”。Lock不是Java语言支持的锁,是JDK包提供的,而synchronized是关键字级别是,它们不一样。 5.Timed Waiting(计时等待) : 等待的那三个方法带了时间参数, 超时会自动唤醒也可以被notify等唤醒 6.Terminated(被终止) :run方法正常执行完,run被未捕获的异常终止 注意:

C#: 线程间操作无效: 从不是创建控件“dataGridView”的线程访问它

倾然丶 夕夏残阳落幕 提交于 2020-04-02 12:11:23
最近在修改自动化小工具,用多线程来解决后台拷贝导致WinForm界面卡死的情况,但是遇到过错:线程间操作无效: 从不是创建控件“dataGridView”的线程访问它。 这是因为在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,如果需要访问窗口中的控件,有2种解决方法: 1. 在Form_Load中添加: //取消跨线程检查 Control.CheckForIllegalCrossThreadCalls = false; 这样进行非安全线程访问时,运行环境就不去检验它是否是线程安全的。 但是不推荐这种方法!!! 2. 利用委托机制实现线程安全。 就是将你所要操作的代码放到一个代理中,然后将这个代理交给创建这个控件的线程来执行你的代码。 //声明委托: private delegate void DelegateDataGridViewWRLUI(); //使用委托在多线程中执行: DelegateDataGridViewWRLUI delegateDataGridViewWRLUI = delegate { this.dataGridViewWRL.DataSource = dataList; this.dataGridViewWRL.Refresh(); this.dataGridViewWRL.EditMode = DataGridViewEditMode

CountDownLatch、CyclicBarrier和Semaphore

不羁的心 提交于 2020-04-02 09:37:54
一.CountDownLatch用法 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。 CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。 当我们调用一次CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await会阻塞当前线程,直到N变成零。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的N个执行步骤。用在多个线程时,你只需要把这个CountDownLatch的引用传递到线程里。 其他方法 如果有某个解析sheet的线程处理的比较慢,我们不可能让主线程一直等待,所以我们可以使用另外一个带指定时间的await方法,await(long time, TimeUnit unit): 这个方法等待特定时间后,就会不再阻塞当前线程。join也有类似的方法。 注意:计数器必须大于等于0,只是等于0时候,计数器就是零,调用await方法时不会阻塞当前线程。CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数器的值

WIN2003+IIS6+FastCGI+PHP5.3的安装配置

纵然是瞬间 提交于 2020-04-01 14:06:23
本文所用的软件的下载地址 fastcgi的下载地址: http://download.microsoft.com/download/E/0/C/E0C0709A-66E5-4113-9A6C-A5F65BF6717D/fcgisetup_1.5_x86_rtw.msi php 5.3下载地址: http://windows.php.net/downloads/releases/php-5.3.29-nts-Win32-VC9-x86.zip 前 言:PHP5.3的版本选择 现在的PHP5.3 For Windows一共给了四个版本:VC9 x86 Non Thread Safe、VC9 x86 Thread Safe、VC6 x86 Non Thread Safe、VC6 x86 Thread Safe,参考PHP官网提供下载的地方左边的英文来看看这几个版本有什么区别。 一、如何选择PHP5.3的VC9版本和 VC6版本 VC6版本是使用Visual Studio 6编译器编译的,如果你的PHP是用Apache来架设的,那你就选择VC6版本。 VC9 版本是使用Visual Studio 2008编译器编译的,如果你的PHP是用IIS来架设的,那你就选择VC9版本。 二、如何选择 PHP5.3的Thread Safe和Non Thread Safe版本 先从字面意思上理解

线程、进程、死锁

别来无恙 提交于 2020-04-01 07:43:16
题目转自http://blog.csdn.net/morewindows/article/details/7392749 第一题:线程的基本概念、线程的基本状态及状态之间的关系? 线程,有时称为轻量级进程,是CPU使用的基本单元;它由线程ID、程序计数器、寄存器集合和堆栈组成。它与属于同一进程的其他线程共享其代码段、数据段和其他操作系统资源(如打开文件和信号)。 线程有四种状态:新生状态、可运行状态、被阻塞状态、死亡状态。状态之间的转换如下图所示: 第二题:线程与进程的区别? 1、 线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。 2、 一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。 3、 系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,出了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。 4、 与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。 5、 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。 第三题

Windbg命令学习7(d*s和~s (n m ~f ~u))

可紊 提交于 2020-04-01 05:39:16
以下默认windbg加载calc程序 1. d*s dds 、 dps 和 dqs 命令显示给定范围内存的内容,它们是把内存区域转储出来,并把内存中每个元素都视为一个符号对其进行解析,dds是四字节视为一个符号,dqs是每8字节视为一个符号,dps是根据当前处理器架构来选择最合适的长度 比如要看看当前stack 中保存了哪些函数地址,就可以检查ebp 指向的内存 0:000> dds ebp 0007fdfc 0007ff1c 0007fe00 010021b0 calc!WinMain+0x25f 0007fe04 0007fee8 0007fe08 00000000 0007fe0c 00000000 0007fe10 00000000 0007fe14 7c80b741 kernel32!GetModuleHandleA 0007fe18 000a232f 0007fe1c 00000000 由于 COM Interface 和C++ Vtable 里面的成员函数都是顺序排列的,所以这个命令可以方便 地找到虚函数表中具体的函数地址。比如用下面的命令可以找到OpaqueDataInfo 类型中虚 函数对应的实际函数地址: 0:002> x ole32!OpaqueData* 76aa6a41 ole32!OpaqueDataInfo::GetOpaqueData = <no

Happen-before

▼魔方 西西 提交于 2020-03-31 15:12:44
1、程序顺序原则:一个线程内保证语义的串行性 2、volatile规则:volatile变量的写,先发现于读,这保证了volatile变量的可见性 3、锁规则:解锁(unlock)必然发生在随后的加锁(lock)前 4、传递性:A先于B,B先于C,那么A必然先于C 5、线程的start()方法先于它的每一个动作 6、线程的所有操作优先于线程的终结(Thread.join()) 7、线程的终端(interrupt())先于被终端线程的代码 8、对象的构造函数执行结束先于finalize()方法 来源: https://www.cnblogs.com/XuZhiDian/p/7361083.html

java 8大happen-before原则

孤街浪徒 提交于 2020-03-31 14:16:06
1. 单线程happen-before原则 :在同一个线程中,书写在前面的操作happen-before后面的操作。 2. 锁的happen-before原则 :同一个锁的unlock操作happen-before此锁的lock操作。 3. volatile的happen-before原则 :对一个volatile变量的写操作happen-before对此变量的任意操作(当然也包括写操作了) 4.happen-before的传递性原则:如果A操作happen-before B操作,B操作happen-before C操作,那么A操作happen-before C 操作 5.线程启动的happen-before原则:同一个线程的start方法happen-before此线程的其他方法。 6.线程中断的happen-before原则:对县城interrupt方法的调用happen-before被中断线程的检测到中断发送的代码。 7.线程终结的happen-before原则:线程中的所有操作都happen-before线程的终止检测。 8. 对象创建的happen-before原则 :对象的初始化完成先于他的finalize方法的调用 来源: https://www.cnblogs.com/Mr-Rocker/p/11757065.html

CAS -- ABA问题的解决方案

点点圈 提交于 2020-03-31 13:05:55
CAS:Compare and Swap, 翻译成比较并交换。 java.util.concurrent包中借助CAS实现了区别于synchronized同步锁的一种乐观锁。 其原理是CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 我们现在来说什么是ABA问题。假设内存中有一个值为A的变量,存储在地址V中。 此时有三个线程想使用CAS的方式更新这个变量的值,每个线程的执行时间有略微偏差。线程1和线程2已经获取当前值,线程3还未获取当前值。 接下来,线程1先一步执行成功,把当前值成功从A更新为B;同时线程2因为某种原因???被阻塞住,没有做更新操作;线程3在线程1更新之后,获取了当前值B。 为什么线程3又反过来操作???是自旋吗??? 在之后,线程2仍然处于阻塞状态,线程3继续执行,成功把当前值从B更新成了A。 最后,线程2终于恢复了运行状态,由于阻塞之前已经获得了“当前值A”,并且经过compare检测,内存地址V中的实际值也是A,所以成功把变量值A更新成了B。 个人见解: 不是说一定出现ABA情况,是说有出现这种情况的可能性。也就是举一个特例来说明问题的可能性??? 看起来这个例子没啥问题,但如果结合实际,就可以发现它的问题所在。 我们假设一个提款机的例子。假设有一个遵循CAS原理的提款机

爬虫数据结构

陌路散爱 提交于 2020-03-31 08:35:12
一、多任务简介 1、为什么要使用多任务爬虫? 在大量的url需要请求时,单线程/单进程去爬取,速度太慢,此时cpu不工作,浪费cpu资源。 爬取与写入文件分离,可以规避io操作,增加爬取速度,充分利用cpu。 2、多任务分类 进程:进程是操作资源分配的最小单位,一个运行的程序,至少包括一个进程,进程之间数据不能共享。(利用多核) 线程:线程是cpu调度的最小单位,一个进程中至少含有一个线程,线程中数据是共享的,如果多个线程操作同一个对象时,需要考虑数据安全问题。(爬虫中最常用) 协程:协程位于线程内部,如果一个线程中运行的代码,遇到IO操作时,切换到线程其他代码执行(最大程度的规避IO操作) 2、如何提高程序的运行速度 1、提高CPU的利用率 假如我们的程序有只有一个线程,CPU就只处理这一个线程。如果在程序中遇到IO操作。此时CPU就不工作了。休息的这段时间,就浪费了CPU的资源。 若我们的程序是多线程的,CPU会在这多个任务之间切换,如果其中一个线程阻塞了,CPU不会休息,会处理其他线程。 2、增加CPU数量 一个CPU同一时间只能护理一个任务,若我们增加CPU数量,那么多个CPU处理多个任务,也会提升程序的运行速度,例如使用多进程。 二、python中的threading模块(开启多线程) cpython解释器下的 python中没有真正的多线程