线程

Thread

丶灬走出姿态 提交于 2020-03-04 22:11:20
线程,进程的区别,及实现方式: /** * 多线程 * 进程:操作系统(os)并发的一个任务 * 并发原理:cpu分时间片,多个任务交替执行(宏观并行,微观串行)有os调度cpu * 线程:一个进程中并发的一个顺序执行的流程 * 线程的组成: * 1.cpu * 2.数据空间(堆空间共享,栈空间独立)每个线程都有自己独立的栈空间,多个线程共享同一个 * 堆空间 * 3.代码 * 线程的五个状态:初始状态 ,就绪状态,运行状态,阻塞状态终止状态 * */ public class TestThread { public static void main ( String [ ] args ) { Thread myThread1 = new Thread ( new MyThread1 ( ) ) ; Thread myThread2 = new Thread ( new MyThread2 ( ) ) ; MyThread3 myThread3 = new MyThread3 ( ) ; MyThread4 myThread4 = new MyThread4 ( ) ; myThread1 . setName ( "线程1" ) ; myThread2 . setName ( "线程2" ) ; myThread3 . setName ( "线程3" ) ; myThread4 .

Java多线程死锁例子

旧城冷巷雨未停 提交于 2020-03-04 22:09:30
目录 一、产生死锁的原因 二、如何避免死锁 一、产生死锁的原因 发生死锁的情况: 多个线程需要同时占用多个共享资源而发生需要互相死循环等待的情况,就是,两个线程互相等待着对象释放锁,一直这样僵持下去,所以导致了死锁的产生。 产生死锁代码: package com . javaagent . thread ; public class DieThread implements Runnable { public static Object obj1 = new Object ( ) ; public static Object obj2 = new Object ( ) ; private boolean flag ; public DieThread ( boolean bl ) { flag = bl ; } @Override public void run ( ) { if ( flag ) { while ( true ) { synchronized ( obj1 ) { try { Thread . sleep ( 1000 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } System . out . println ( "线程" + Thread . currentThread

关于线程的属性

梦想与她 提交于 2020-03-04 22:04:19
一、线程的属性 二、线程的ID 运行上面的main方法,我们发现了问题,为什么一个ID是1,另一个应该是2,确变成了12。 源码中我们可以看到,线程ID,是自增的,初始值为0,且为前缀递增,所以第一个线程的ID不是0,而是1。 degug发现有很多个线程,这就证明除了我们写的主子线程之外,JVM还帮我们创建了一些线程。 二、 线程的名字 1.源码中线程默认的名字 2.修改线程名字 如果没在线程的构造函数里写入线程的名字,依然可以在后期setName改变,但是一旦线程启动,他native层的名字就没法改了。 3.守护线程 给用户线程提供服务(GC),一般由JVM创建(main非守护线程),线程类型默认继承自父线程,不影响JVM退出。 和普通线程的区别:整体上没什么区别,区别在于是否会影响到JVM的退出,用户进程是执行逻辑的,守护进程是服务于我们的,我们不应该把自己的线程设置为守护线程。 4.线程优先级 JAVA中有10个级别,默认是5. 源码中关于优先级的地方,分为最低,最高,一般为五,总共有10种(1-10)。 ☆注意:程序设计不应该依赖优先级,因为不同的操作系统不一样。在同一种操作系统中,优先级也会被操作系统改变。 来源: CSDN 作者: xuehw. 链接: https://blog.csdn.net/weixin_43192775/article/details

并发编程系列——什么是重排序?

邮差的信 提交于 2020-03-04 21:38:01
今天就来学习下重排序相关的知识。 在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 在单线程环境下不能改变程序运行的结果; 存在数据依赖关系的不允许重排序 as-if-serial语义 as-if-serial语义的意思是, 所有的操作均可以为了优化而被重排序,但是你必须要保证重排序后执行的结果不能被改变 ,编译器、runtime、处理器都必须遵守as-if-serial语义。注意as-if-serial只保证单线程环境,多线程环境下无效。 下面我们用一个简单的示例来说明: int a = 1 ; //A int b = 2 ; //B int c = a + b; //C A、B、C三个操作存在如下关系:A、B不存在数据依赖关系,A和C、B和C存在数据依赖关系,因此在进行重排序的时候,A、B可以随意排序,但是必须位于C的前面,执行顺序可以是A –> B –> C或者B –> A –> C。但是无论是何种执行顺序最终的结果C总是等于3。 as-if-serail语义把单线程程序保护起来了,它可以保证在重排序的前提下程序的最终结果始终都是一致的。 其实对于上段代码,他们存在这样的happen-before关系: A happens-before B B happens-before C A

CountDownLatch类 和 CyclicBarrier类 详解与区别

耗尽温柔 提交于 2020-03-04 20:12:13
1. CountDownLatch 类 CountDownLatch 类是用于线程同步的工具,作用:让一个或多个源线程(调用await方法的线程) 必须 等待一个或多个目标线程(调用countDown方法的线程)都执行完成了才能继续执行自己的代码。 注意: 1. 不会妨碍目标线程的执行,但是会阻塞源线程,因为await方法会检测count是为0,如果不是0,就会阻塞,不会继续执行后面的代码。 2. 它是一次性的,不能重复用,因为count变为0之后,就不会再改变了,只有一个countDown方法去减,没有方法去让count加,所以如果你重复使用的话,不起作用,count永远为0。 3. 当然,你可以在一个线程的run方法里调用多次countDown 方法,多减几个1。 比如一个测评系统,需要测评一个人的优秀值good,good是通过一个计算公式来计算出的,这个公式为good = 身高 + 体重 + 智力 + 情商 + 颜值,那么我们可以创建5个线程A,B,C,D,E,分别去测试出:身高、体重、智力、情商、颜值,要想计算出good,必须等待5个线程都执行完毕,身高、体重、智力、情商、颜值都得到了,才能进一步计算good。 此时CountDownLatch类就有用了。 public class CountDownLatch { // 构造方法,初始化计数值 public

编程语言工具和环境

此生再无相见时 提交于 2020-03-04 19:58:19
什么是python的生成器? python生成器是一个返回可以迭代对象的函数,可以被用作控制循环的迭代行为。生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,一般的函数会返回包括所有数值的数组,生成器一次只能返回一个值,这样消耗的内存将会大大减小。 yield生成器解释 Java抽象类和接口的区别? Java中,一个类可以实现多个接口,但是一个类只能继承一个抽象类。 接口中只包含接口签名,而抽象类可以提高默认实现,子类可以重载抽象类方法。 接口中默认的所有方法均为public修饰,而抽象类可以用protected修饰符。 接口中不允许定义任何属性,而抽象类中可以定义属性和常量在应用场景中。 在应用场景中使用接口来完成同一方法的不同实现,若不同的方法实现需要共享同样的行为或状态则用抽象类。 python中is和==的区别 is是用来判断两个变量引用的对象是否为同一个,==用于判断引用对象的值是否相等。可以通过id()函数查看引用对象的地址。 python方法解析顺序 Python的方法解析顺序优先级从高到低为:实例本身->类->继承类(继承关系越近,越先定义,优先级越高) 方法解析:是一种在多重继承中用于确定方法搜索顺序的算法. Ctrl+C程序挂掉还是抛出异常,如何判断两个dict是否一样,list头上删除元素,字符串拼接? Ctrl+C会挂掉程序

C++ 智能指针 auto_ptr 和 shared_ptr

空扰寡人 提交于 2020-03-04 17:19:04
首先,如果你不知道什么是智能指针,请先移步: C++智能指针简单剖析 1.auto_ptr 1 #ifndef AUTO_PTR_H 2 #define AUTO_PTR_H 3 4 template<typename T> 5 class auto_ptr 6 { 7 public : 8 //使用explicit关键字避免隐式转换 9 explicit auto_ptr(T* p=0); 10 ~auto_ptr(); 11 12 //使用另一个类型兼容的auto_ptr来初始化一个新的auto_ptr 13 template<typename U> 14 auto_ptr(auto_ptr<U>& rhs); 15 16 template<typename U> 17 auto_ptr<T>& operator=(auto_ptr<U>& rhs); 18 19 T& operator*() const; 20 T* operator->() const; 21 22 //返回原始对象的指针 23 T* get() const; 24 //放弃指针的所有权 25 T* release(); 26 //删除原有指针并获得指针p的所有权 27 void reset(T* p=0); 28 29 private: 30 T* pointee; 31 }; 32 33

用户线程与守护线程

心已入冬 提交于 2020-03-04 17:16:21
Java线程中有两种线程:①用户线程 ②守护线程 用户线程: 平时用到的普通线程均是用户线程 守护线程: 指在程序运行的时候在后台提供一种通用服务的线程,守护线程是为用户线程服务的,当有用户线程在运行,那么守护线程同样需要工作,当所有的用户线程都结束时,守护线程也就会停止 守护线程是依赖于用户线程,用户线程退出了,守护线程也就会退出,典型的守护线程如垃圾回收线程。 用户线程是独立存在的,不会因为其他用户线程退出而退出。 守护线程不应该去访问固有资源,如进行读写操作(文件,数据库),因为守护线程是跟随用户线程的,当没有用户线程工作时,守护线程会立即结束 来源: oschina 链接: https://my.oschina.net/u/4167465/blog/3187931

C# WINFORM的定时作业 sleep和Quartz区别(Quartz并不好用)

被刻印的时光 ゝ 提交于 2020-03-04 15:45:08
程序需要实现定时作业的功能经常会遇到,之前我一直使用Sleep,今天我突然觉得C# 应该有简单的定时作业类可以使用吧,于是我百度了一把,果然有一个Quartz,但是使用后发现只能加载静态类代码,其实很不灵活。 一、C# WINFORM 中使用Quartz的例子代码: 1、VS2019创建一个WINFROM项目,NuGit管理器中直接安装Quartz。 2、加入下面的代码, 我专门为Quartz启动了一个线程m2: 1) Quartz的实现要建一个工厂factory, 2)建一个定时作业scheduler 3)加入一个工作项目job 4)加入一个触发条件trigger 5)最后执行就好。 注意这行代码: IJobDetail job = JobBuilder.Create<JobDemo>().Build(); 这个尖括号<>里面需要用到一个类,为此我们还要专门提供这个类 public class JobDemo:IJob,并在代码中加入定时执行的作业,这非常的不科学,静态的类不够灵活,很难访问instance中的全局变量,所以定时作业的使用会有很大的限制。虽然代码还是实现了5秒提示一个消息窗口,但是我准备不用Quartz。 using Quartz; using Quartz.Impl; namespace WindowsFormsApp1 { public partial

异步同步、阻塞非阻塞、异步回调、线程队列和协程

六月ゝ 毕业季﹏ 提交于 2020-03-04 15:35:34
  今天学习了异步同步、阻塞非阻塞、异步回调、线程队列和协程   一、异步同步和阻塞非阻塞   线程的三种状态:     1、就绪     2、运行     3、阻塞   阻塞:遇到了IO操作 代码卡住 无法执行下一行 CPU会切换到其他任务   非阻塞: 与阻塞相反 代码正在执行(运行状态) 或处于就绪状态   阻塞和非阻塞描述的是运行的状态   同步:提交任务必须等待任务完成,才能执行下一行   异步:提交任务不需要等待任务完成,立即执行下一行   指的是一种提交任务的方式   二、异步回调     为什么回调:子进程帮助主进程完成任务 处理任务的结果应该交还给主进程     其他方式也可以将数据交还给主进程       1、shutdown 主进程会等到所有任务完成       2、result函数 会阻塞直到任务完成     注意:       回调函数什么时候被执行?子进程完成时       谁在执行回调函数?主进程     线程的异步回调       使用方式都相同 唯一的不同是执行回调函数 是子线程在执行 #进程利用回调完成生产者消费者from concurrent.futures import ProcessPoolExecutor import os pool = ProcessPoolExecutor() #爬虫 从网络某个地址获取一个HTML文件 import