线程

多线程开发

百般思念 提交于 2020-02-29 09:33:14
参考文献: object.wait()和object.notify()和object.notifyall() 正文 wait、notify和notifyAll方法是Object类的final native方法。所以这些方法不能被子类重写,Object类是所有类的超类,因此在程序中有以下三种形式调用wait等方法。 wait();//方式1: this.wait();//方式2: super.wait();//方式3 void notifyAll() 解除 所有 那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在 同步方法 或 同步块 内部调用。如果当前线程不是锁的持有者,该方法抛出一个 IllegalMonitorStateException 异常。 void notify() 随机选择一个 在该对象上调用wait方法的线程,解除其阻塞状态。该方法只能在 同步方法 或 同步块 内部调用。如果当前线程不是锁的持有者,该方法抛出一个 IllegalMonitorStateException 异常。 void wait() 导致线程进入等待状态,直到它被其他线程通过notify()或者notifyAll唤醒。该方法只能在 同步方法 中调用。如果当前线程不是锁的持有者,该方法抛出一个 IllegalMonitorStateException 异常。 void wait(long

刨根问底-ThreadLocal线程安全

孤人 提交于 2020-02-29 09:17:30
1、线程安全,值得是在多线程环境先,一个类在执行某个方法时,对类的内部实例变量的访问时安全的。因此,对于下面列出来的2类变量,不存在任何线程安全的说法: (1)方法签名中的任何参数变量 (2)处于方法内部的局部变量 线程安全针对于类内部的全局变量 2、java.lang.ThreadLocal类是jdk提供一种解决多线程并发问题方案。 ThreadLocal类在维护变量时,实际使用了当前线程Thread中的一个叫做ThreadLocalMap的独立副本,每个线程可以独立修改属于自己的副本而不会相互影响,从而隔离了线程和线程,避免了线程访问实例变量发生冲突的问题。 TreadLocal本身并不是一个线程,而是通过操作当前线程中的一个内部变量来达到与其他线程隔离的目的。之所以叫TdreadLocal,表示了其操作的对象时线程的一个本地变量。 现在看Thread代码: public class Thread implements Runnable { ThreadLocal.ThreadLocalMap threadLocals = null; } ThreadLocalMap跟随者当前的线程而存在。不用的线程Thread,拥有不同的ThreadLocalMap的本地实例变量,这就是副本的含义。 ThreadLocal是如何操作ThreadLocalMAP的 : public class

Java BIO、NIO、AIO 学习

被刻印的时光 ゝ 提交于 2020-02-29 09:06:16
先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写)。 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS需要支持异步IO操作API)。 阻塞 : ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回)。 非阻塞 : 柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成)。 Java对BIO、NIO、AIO的支持 : Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 Java AIO(NIO.2) : 异步非阻塞

Python:使用threading模块实现多线程(转)

ぐ巨炮叔叔 提交于 2020-02-29 08:58:11
Python:使用threading模块实现多线程(转) 分类: python 标签: thread 评论: 暂无评论 阅读:5,420 views 综述 Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势。 在Python中我们主要是通过thread和 threading这两个模块来实现的,其中Python的threading模块是对thread做了一些包装的,可以更加方便的被使用,所以我们使用 threading模块实现多线程编程。这篇文章我们主要来看看Python对多线程编程的支持。 在语言层面,Python对多线程提供了很好的支持,可以方便地支持创建线程、互斥锁、信号量、同步等特性。下面就是官网上介绍threading模块的基本资料及功能: 实现模块 thread:多线程的底层支持模块,一般不建议使用; threading:对thread进行了封装,将一些线程的操作对象化 threading模块 Thread 线程类,这是我们用的最多的一个类,你可以指定线程函数执行或者继承自它都可以实现子线程功能; Timer与Thread类似,但要等待一段时间后才开始运行; Lock 锁原语,这个我们可以对全局变量互斥时使用; RLock

python语法基础-并发编程-线程-其他

一笑奈何 提交于 2020-02-29 08:55:00
############### 信号量和事件 ############## # 信号量 # 信号量就是控制只能有n个线程能访问这段代码 # from threading import Semaphore,Thread # import time # def func(sem,a,b): # sem.acquire() # time.sleep(1) # print(a+b) # sem.release() # # sem = Semaphore(4) # for i in range(10): # t = Thread(target=func,args=(sem,i,i+5)) # t.start() # 事件: # 事件被创建的时候是false状态,这个false状态会导致wait被阻塞, # true状态的时候,wait就不阻塞了 # clear,设置为false # set,设置状态未false, # 上次举例的是红绿灯的例子, # 现在我们举一个例子,检测数据库的可连接情况 # 启动两个线程, # 第一个线程连接数据库, # 等待一个信号,告诉我们之间的网络是通的 # 第二个线程,检测和数据自己之间的网络是否是通的 # 通了之后把事件的状态改为true, import time,random from threading import Thread,Event def

初识synchronized

谁说我不能喝 提交于 2020-02-29 08:54:05
初识synchronized 线程安全问题 什么是synchronized synchronized几种使用方式 synchronized特性 线程安全问题 首先得知道什么是线程安全问题 这里我们打个比方 在同一个时间段我们使用两个线程对同一个数据进行++操作,这个被操作数据就可能会出现线程安全问题,假如说这个数据是0,两个线程同时++,我们想要得到的数据是2,但其实最后是1,原因是线程之间是不可见的。 第一个线程在读这个数的时候是0,假如第二个线程在第一个线程写回前读了这个数,那么它读到的也是0,这个时候第一个线程写回也就是++操作,这个时候这个数是1,而第二个线程对读到的数进行++操作,写回的时候也是1。 我们看代码: public class test4 { public static class MyRunna implements Runnable { public static int count; @Override public void run() { count++; } } public static void main(String[] args) throws InterruptedException { for (int i = 0; i < 1000; i++) { new Thread(new MyRunna()).start(); } Thread

Android 多线程----AsyncTask异步任务详解

夙愿已清 提交于 2020-02-29 08:48:04
【声明】 欢迎转载,但请保留文章原始出处→_→ 生命壹号: http://www.cnblogs.com/smyhvae/ 文章来源: http://www.cnblogs.com/smyhvae/p/3866570.html 【正文】 本文将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信。 一、Android当中的多线程: 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序组件在运行时,Android系统就会为该应用程序组件开辟一个新的线程来执行。默认的情况下,在一个相同Android应用程序当中,里面的组件都是运行在同一个线程里的,这个线程称之为Main线程。当我们通过某个组件来启动另一个组件的时候,这个时候默认都是在同一个线程当中完成的。当然,我们可以自己来管理我们的Android应用的线程,我们可以根据我们自己的需要来给应用程序创建额外的线程。 二、Main Thread 和 Worker Thread: 在Android当中,通常将线程分为两种,一种叫做Main Thread,除了Main Thread之外的线程都可称为Worker Thread。 当一个应用程序运行的时候,Android操作系统就会给该应用程序启动一个线程,这个线程就是我们的Main Thread,这个线程非常重要

java并发编程概念

不问归期 提交于 2020-02-29 08:27:24
并发: 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。 并行: 当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。 区别: 并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。在 多道程序 环境下, 并发性 是指在一段时间内宏观上有多个程序在同时运行,但在 单处理机系统 中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在 计算机系统 中有多个 处理机 ,则这些可以并发执行的程序便可被分配到多个处理机上,实现 并行执行 ,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可以同时执行。 高并发:(High Concurrent) 是互联网分布式系统架构设计中必须考虑的因素之一,指通过设计保证系统能够同时并行处理很多请求。 https://www.cnblogs.com/yanlong300/p/8986041.html

python多线程(条件变量同步)

跟風遠走 提交于 2020-02-29 08:21:36
互斥锁 是最简单的线程同步机制,Python提供的Condition对象提供了对复杂线程同步问题的支持。Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。 可以认为Condition对象维护了一个锁(Lock/RLock)和一个waiting池。线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。 Condition对象的构造函数可以接受一个Lock/RLock对象作为参数,如果没有指定,则Condition对象会在内部自行创建一个RLock。 除了notify方法外,Condition对象还提供了notifyAll方法,可以通知waiting池中的所有线程尝试acquire内部锁。由于上述机制

java并发之线程的创建(一)

柔情痞子 提交于 2020-02-29 08:16:16
概论 最近在学习并发,于是我在网上搜了一本《java并发编程实战》书学习。 传统创建线程的方式(jdk 1.5之前的方式) 在我印象中创建线程有两种方式 1. 继承Thread类,重写run方法,实例化自己写Thread子类,并用start()方法开启。 2.实现Runnable接口,重写run方法,把Runnable的子类的实例对象作为Thread的构造参数传递进去,创建线程,并开启。 但是我看别人代码时大部分都用第一种方式,直接new Thread 然后重写run方法。其实第二种方式更加符合面向对象的编程,因为,Thread是一个线程,他只管创建和开启线程,而不应该进行逻辑的处理代码写到里面,逻辑处理应该交给Runnable的子类的进行。 传统创建定时器的方式 传统定时器是Timer类,创建方式 Timer timer = new Timer(); timer.schedule(new TimerTask(){ //创建定时器任务 @Override public void run() { System.out.println("你好"); } },2000); //2秒之后打印你好 timer.schedule(new TimerTask(){ @Override public void run() { System.out.println("你好"); } },2000