线程

多进程(1)

自作多情 提交于 2020-03-08 22:21:07
多线程 1.认识线程 1.1概念 进程是系统分配资源的最小单位 线程是系统调度的最小单位 一个进程内的线程之间是可以共享资源的 每个进程内至少有一个线程存在,即主线程 进程和线程的区别? 1.进程是系统分配资源的最小单位 2.线程是系统调度的最小单位 3.一个进程中的各个线程之间共享 方法区(常量池)、堆 线程也存在并发、并行 代码1: public static void main ( String [ ] args ) throws InterruptedException { Thread . sleep ( 9999999 L ) ; } 使用 jconsole 命令观察线程 代码2: public static void main ( String [ ] args ) throws InterruptedException { new Thread ( new Runnable ( ) { @Override public void run ( ) { try { Thread . sleep ( 9999999 L ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } } } ) . start ( ) ; } 使用 jconsole 命令观察线程 代码1的线程名字是 main

android内存优化-Activity, Thread引起的内存泄露0

假装没事ソ 提交于 2020-03-08 20:43:49
Android编程中一个共同的困难就是协调Activity的生命周期和长时间运行的任务(task),并且要避免可能的内存泄露。思考下面Activity的代码,在它启动的时候开启一个线程并循环执行任务。 1 /** 2 * 一个展示线程如何在配置变化中存活下来的例子(配置变化会导致创 3 * 建线程的Activity被销毁)。代码中的Activity泄露了,因为线程被实 4 * 例为一个匿名类实例,它隐式地持有外部Activity实例,因此阻止Activity 5 * 被回收。 6 */ 7 public class MainActivity extends Activity { 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 exampleOne(); 13 } 1415 private void exampleOne() { 16 new Thread() { 17 @Override 18 public void run() { 19 while (true) { 20 SystemClock.sleep(1000); 21 } 22 } 23 }.start(); 24 } 25 } 当配置发生变化

线程的启动和终止

拥有回忆 提交于 2020-03-08 20:03:34
python中的进程和线程 进程:资源的容器,会启动一个解释器进程,里面跑你的程序,多线程共享同一个解释器进程 线程:干活的 python的线程开发 使用标准库threading 我们来敲一个小demo来测试一下什么是多线程编程 import threading import time def worker ( ) : count = 0 while True : print ( "I am working" ) count += 1 if count > 10 : break t = threading . Thread ( target = worker ) # 创建新的线程 t . start ( ) print ( "====fin====" ) 返回结果 我们来对比一下以下代码 import threading import time def worker ( ) : count = 0 while True : print ( "I am working" ) count += 1 if count > 10 : break t = threading . Thread ( target = worker ) # 创建新的线程 if __name__ == "__main__" : print ( "====fin====" ) t . start ( ) 返回结果

java多线程

こ雲淡風輕ζ 提交于 2020-03-08 19:19:02
并行与并发 进程与线程 进程:正在执行的一个程序,例如一个软件,例如360。 线程:进程中的多个执行功能(进程中的一个执行单元),一个进程中至少有一个线程,例如360的电脑体检、木马查杀,每一个都是360的一个线程。 多线程保证的是多条线程交替执行。 多线程程序执行cpu的调度方式 java实现多线程的两种方式 两种方式的区别 耦合:如果子类继承父类,而子类什么方法都没有,一直在用父类的,突然子类不再继承父类,子类就废物了,耦合性(依赖度dongzh)太高, 实现的话,如果子类实现了父类的方法,突然不实现父类了,依然可以使用自己的方法。 来源: CSDN 作者: 快些儿 链接: https://blog.csdn.net/weixin_44431371/article/details/104737155

Java并发学习笔记(一)锁

情到浓时终转凉″ 提交于 2020-03-08 18:27:25
Java并发学习笔记(一)锁 前言 在多线程环境中,如果对共享变量进行非原子的操作,就很可能出现线程安全问题,为了维护多线程环境下操作共享变量的数据一致性,通常我们就需要用到锁,在Java中,关于锁的概念很多,在学习的过程中整理了一部分简单给大家分享一下。 锁名词概念 死锁、活锁、饥饿锁、无锁 悲观锁、乐观锁 偏向锁、轻量级锁、重量级锁 重入锁 非公平锁、公平锁 独占锁、共享锁 读写锁 以上锁相关名词有的指锁的状态,有的是锁的设计思想,还有一些锁实现相关的特性等等,一些名词之间存在强关联,不是很好分类,下面逐步进行展开说明。 死锁 死锁原因 多个线程竞争共享资源,由于抢占顺序不一致导致线程间互相等待对方持有的资源释放,导致线程永久阻塞等待。 死锁条件 互斥条件:共享资源只能同时被一个线程占用 请求与保持条件:线程1已经取得共享资源X,在等待共享资源Y的时候,不释放共享资源X 不可剥夺条件:线程1占有的共享资源,其他线程不能强行抢占 循环等待条件:线程1等待线程2占有的资源,线程2等待线程1占有的资源,就是互相等待 如何避免死锁 不使用锁或者不使用两把及以上的锁 必须使用两把及以上的锁时,保证整个应用获取锁的顺序一致 尝试获取具有超时释放的锁,比如tryLock 当发生Java-Level的死锁时,重启程序干掉进程或者线程,比如数据库事务 如何定位死锁 jps及jstack命令定位

并发工具——Semaphore

心不动则不痛 提交于 2020-03-08 18:24:18
Semaphore的使用和操作系统中的信号量的使用差不多,可以类比去理解。 Semaphore用于限制可以访问某些资源(物理或逻辑的)的线程数目,他维护了一个许可证集合,有多少资源需要限制就维护多少许可证集合,假如这里有N个资源,那就对应于N个许可证,同一时刻也只能有N个线程访问。一个线程获取许可证就调用acquire方法,用完了释放资源就调用release方法。 停车场案例代码实现: public class CarDemo { public static void main(String[] args) { //创建Semaphore Semaphore sp=new Semaphore(5); Thread[] car=new Thread[10]; for (int i = 0; i < 10; i++) { car[i]=new Thread(()->{ //请求许可 try { sp.acquire(); System.out.println(Thread.currentThread().getName()+"可以进停车场"); } catch (InterruptedException e) { e.printStackTrace(); } //使用资源 try { int val= new Random().nextInt(10); TimeUnit.SECONDS

并发编程和并行编程有什么区别?

风流意气都作罢 提交于 2020-03-08 18:16:49
并行编程和并行编程有什么区别? 我问谷歌,但没有找到任何可以帮助我理解这种差异的东西。 你能给我两个例子吗? 现在,我找到了以下解释: http : //www.linux-mag.com/id/7411- 但是“并发是程序的属性”与“并行执行是机器的属性”对我来说还不够-我还是不能说什么。 #1楼 我在一些博客中找到了此内容。 认为它是有用和相关的。 并发和并行性不是一回事。 如果未预先确定两个任务的执行顺序,则两个任务T1和T2是并发的, T1可以在T2之前执行并完成,T2可以在相同时间(并行)同时执行T1,T1和T2之前执行并完成,T1和T2可以交替执行,...如果有两个并发线程如果操作系统将其调度为在一个单核非SMT非CMP处理器上运行,则可能会并发但不会并行。 并行可能在多核,多处理器或分布式系统上进行。 并发通常被称为程序的属性,并且是比并行性更笼统的概念。 资料来源: https : //blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming #2楼 我相信并发编程是指多线程编程,它是让您的程序运行从硬件详细信息中抽象出来的多个线程。 并行编程是指专门设计程序算法以利用可用的并行执行。 例如,您可以并行执行某些算法的两个分支

Android线程通信

廉价感情. 提交于 2020-03-08 18:11:38
摘要   andriod提供了 Handler 和 Looper 来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的。 正文 图解: 代码示例: /** * @author allin.dev * http://allin.cnblogs.com */ public class MainThread extends Activity { private static final String TAG = "MainThread"; private Handler mMainHandler, mChildHandler; private TextView info; private Button msgBtn; @Override public void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setContentView( R.layout.main ); info = (TextView) findViewById( R.id.info ); msgBtn = (Button) findViewById( R.id.msgBtn ); mMainHandler = new

并发编程下的三大问题根源(原子性,可见性,有序性)和各种并发问题

℡╲_俬逩灬. 提交于 2020-03-08 17:09:43
本篇不讲解决方式,只是提出并发编程的问题,下面看一下并发问题的结构 问题根源:可见性,原子性,有序性。 缓存导致的可见性问题 结合上图来看一下可见性问题 int count = 0 Thread th1 = new Thread ( ( ) - > { count += 1000 ; } ) ; Thread th1 = new Thread ( ( ) - > { count += 1000 ; } ) ; count = ? 直觉告诉我们应该是2000,但是不对,可能是2000,也有可能是1000. 下面我们来结合下图解释一下,其实他是cpu缓存导致的问题,当线程A从内存中读取count值到自己cpu的缓存中,对缓存中的count+1000,但是还没写回内存,此时如果线程B进行+1000操作,从内存中读到自己所在cpu的缓存中,因为内存没有变,还是1000,然后+1000,然后两个线程在进行写回内存的操作,就变成覆盖(count=2000执行两遍)了 线程切换导致的原子性问题 因为计算机cpu速度是非常快的,为了平衡计算机其他资源的速度,比如io.会进行线程切换, 线程切换:就是cpu在执行一个线程时,cpu给它一个时间片,时间片结束,可能该线程还没有执行完,就会保存该线程的当前状态,把cpu的资源给其他线程。 执行一条计算机指令是原子操作的

面试之线程相关

不想你离开。 提交于 2020-03-08 16:45:25
面试之线程相关 1.什么是进程? 1.进程是系统中正在运行的一个程序,程序一旦运行就是进程。 2.进程可以看做程序执行的一个实例,进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间的通信,比如管道,文件,套接字 3.一个进程可以拥有多个线程,每个线程使用所属进程的栈空间。同一进程内多个线程会共享部分状态,多个线程可以读写一块内存。同时每一个线程还拥有自己的寄存器和栈,其他线程可以读写这些栈内存。 2.什么是线程? 1.线程是操作系统能够进行运算调度的最小单位。 2.线程是进程的一个实体,是进程的一条执行路径,当一个线程修改了资源,他的兄弟线程可以立即看到这种变化。 3.并发和并行和串行 1.并行指在同一时刻,有多条指令在多个处理器上同时执行;而并发是指两个或多个事件在同一时间间隔(宏观上)发生。 2.并行是在不同实体的多个事件,并发是在同一实体的多个事件 3.并发是指一个处理器同时处理多个任务。并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。 4 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行 5.串行