多线程

多线程创建方式及线程安全问题

女生的网名这么多〃 提交于 2020-03-11 07:42:46
1.创建线程方式 一: 创建线程方式一继承 Thread 类 public clsss MyThread extends Thread{ //重写 run方法 ,设置线程任务 Run(){ } } main(){ new MyThread().start(); } 获取线程名称: Thread.currentThread()获取当前线程对象 Thread.currentThread().getName();获取当前线程对象的名称 二: 创建线程方式 — 实现 Runnable 接口 创建线程的步骤。 1、定义类实现 Runnable接口。 2、覆盖接口中的 run方法。。 3、创建 Thread类的对象 4、将 Runnable接口的子类对象作为参数传递给 Thread类的构造函数。 5、调用 Thread类的 start方法开启线程。 l 代码演示: public class Demo02 { public static void main(String[] args) { // 创建线程执行目标类对象 Runnable runn = new MyRunnable(); // 将 Runnable 接口的子类对象作为参数传递给 Thread 类的构造函数 Thread thread = new Thread(runn); Thread thread2 = new Thread

Servlet学习笔记

本秂侑毒 提交于 2020-03-11 06:32:31
一、Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的 数据库 或应用程序之间的中间层。 使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。 Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势: 1、性能明显更好。 2、Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。 3、Servlet 是独立于平台的,因为它们是用 Java 编写的。 4、服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。 5、Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。 二、Servlet的生命周期 Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程: 1、Servlet 通过调用 init () 方法进行初始化

「干货」你必须掌握的 21 个 Java 核心技术

非 Y 不嫁゛ 提交于 2020-03-11 04:51:35
「干货」你必须掌握的 21 个 Java 核心技术 这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE相关的、和Java中各个框架相关的内容。 经过这么多年的Java开发,以及结合平时面试Java开发者的一些经验,我觉得对于J2SE方面主要就是要掌握以下的一些内容。 JVM相关 对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此里面的概念有一些简单的了解即可。 不过对于一个有着3年以上Java经验的资深开发者来说,不会JVM几乎是不可接受的。 JVM作为java运行的基础,很难相信对于JVM一点都不了解的人可以把java语言吃得很透。 我在面试有超过3年Java经验的开发者的时候, JVM几乎就是一个必问的问题了。 当然JVM不是唯一决定技术能力好坏的面试问题,但是可以佐证java开发能力的高低。 在JVM这个大类中,我认为需要掌握的知识有: JVM内存模型和结构 GC原理,性能调优 调优:Thread Dump, 分析内存结构 class 二进制字节码结构, class loader 体系 , class加载过程 , 实例创建过程 方法执行过程 Java各个大版本更新提供的新特性(需要简单了解) Java的运行 这条可能出看很简单,java程序的运行谁不会呢? 不过很多时候, 我们只是单纯通过IDE去执行java程序

pythonの多线程

↘锁芯ラ 提交于 2020-03-10 11:55:30
python的GIL 在非python环境中,单核情况下,同时只能有一个任务执行。多核时可以支持多个线程同时执行。 在python中,无论有多少核,同时只能执行一个线程,这是由于GIL所导致的。 GIL(Global Interpreter Lock全局解释器锁),是为了数据安全所做的决定,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”。 在一个python进程中,GIL只有一个 拿不到GIL的线程,就不允许进入CPU执行 GIL的释放逻辑 python2.x中,在线程遇见IO操作或者ticks计数达到100时进行释放(ticks是python自身的一个计数器,专门用于做GIL,每次释放后归零,这个计数可以通过sys.setcheckinterval来调整) python3.x中,改为使用计时器(当执行时间达到阈值后,当前线程释放GIL) 释放GIL锁后,线程会进行锁竞争,随后切换线程,会消耗资源 由于python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),所以在多核CPU上,python的多线程效率并不高 python多线程工作过程 1.拿到公共数据 2.申请GIL 3.python解释器调用os原生线程 4.os操作cpu执行运算 5.当该线程达到gil的释放要求时,无论运算是否已经执行完,gil都被要求释放 6.其他线程重复上面的过程

python多线程机制

时间秒杀一切 提交于 2020-03-10 11:28:11
Python中的线程从一开始就是操作系统的原生线程。而Python虚拟机也同样使用一个全局解释器锁(Global Interpreter Lock,GIL)来互斥线程多Python虚拟机的使用。 GIL与线程调度   为了理解Pyhon为什么需要GIL,考虑这样的情形:假设有两个线程A B,在两个线程中,都同时保存着对内存中同一对象obj的引用,也就是说,这事obj->ob_refcnt的值为2.如果A销毁对obj的引用,显然,A将通过Py_DECREF调整obj的引用计数值。外面知道,py_DECREF的整个动作可以分为两个部分:   --obj ->ob_refcnt;   if(obj->ob_refcnt == 0) destory object and free memory.   如果A执行完第一个动作后,obj->ob_refcnt的值变为1,不幸的是,在这里时候线程调度机制将A挂起,唤醒了B。更为不幸的是,B同样也开始销毁对obj的引用。B完成第一个动作后,obj ->ob_refcnt为0,B是一个幸运儿,它没有被线程调度打断,而是顺利完成了接下来的第二个动作,将对象销毁,内存释放。好了吗,现在A又被重新唤醒,可现在已是物是人非,obj ->ob_refcnt已经被B减少到0,而不是当时的1.按照约定,A开始在一次地对已经销毁的对象进行对象销毁的内存释放动作

7.03_多线程2

那年仲夏 提交于 2020-03-10 08:24:49
一、Timer类:计时器       public class Demo5_Timer {         /**         * @param args         * 计时器         * @throws InterruptedException         */         public static void main(String[] args) throws InterruptedException {           Timer t = new Timer();           t.schedule(new MyTimerTask(), new Date(114,9,15,10,54,20),3000);             while(true) {               System.out.println(new Date());               Thread.sleep(1000);             }           }         }     class MyTimerTask extends TimerTask {           @Override           public void run() {             System.out.println(

爬虫学习笔记-多线程(1)

我怕爱的太早我们不能终老 提交于 2020-03-09 13:40:48
一个线程只属于一个进程 一个进程可以有多个线程 在进程内部,如果要干多个事情,就需要运行多个子任务,这些子任务叫线程,线程共享所属进程地内存空间 模块: 1,_thrad模块 低级模块 2,threading模块 高级模块,对低级模块进行封装 普通实例 import threading , time def run ( num ) : print ( '子线程(%s)开始' % ( threading . current_thread ( ) . name ) ) time . sleep ( 2 ) print ( '打印' , num ) time . sleep ( 2 ) print ( '子线程(%s)结束' % ( threading . current_thread ( ) . name ) ) if __name__ == '__main__' : print ( '主线程(%s)开始' % ( threading . current_thread ( ) . name ) ) t = threading . Thread ( target = run , name = 'runthread' , args = ( 1 , ) ) #target为这个主线程要执行地函数名字 #args为要传入的函数参数 #用t这个变量接收线程 t . start ( ) #运行线程

Java多线程中join方法的理解

耗尽温柔 提交于 2020-03-09 11:30:45
https://www.iteye.com/blog/uule-1101994 thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。 t.join(); //使调用线程 t 在此之前执行完毕。 t.join(1000); //等待 t 线程,等待时间是1000毫秒 先上一段JDK中代码: Java代码 /** * Waits at most <code>millis</code> milliseconds for this thread to * die. A timeout of <code>0</code> means to wait forever. */ //此处A timeout of 0 means to wait forever 字面意思是永远等待,其实是等到t结束后。 public final synchronized void join( long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException(

QGIS初识-Qt编译环境配置

萝らか妹 提交于 2020-03-09 09:00:14
1、QT Tools for Visual Studio2019下载地址(其他的版本也有): https://marketplace.visualstudio.com/items?itemName=TheQtCompany.QtVisualStudioTools2019;需要在vs的插件管理里指定QT5 的安装目录才能使用该模板。 2、添加库头引用:OSGEO4W/include,QGIS/include; 3、添加宏指令: CORE_EXPORT=__declspec(dllimport) GUI_EXPORT=__declspec(dllimport) PYTHON_EXPORT=__declspec(dllimport) ANALYSIS_EXPORT=__declspec(dllimport) APP_EXPORT=__declspec(dllimport) CUSTOMWIDGETS_EXPORT=__declspec(dllimport) 4、添加库lib目录和lib文件: OSGEO4W/lib,QGIS/lib 这里要特别注意,在vs下,会默认添加debug版的qt lib文件 (有d后缀),如果发现,一定要替换为release(无d后缀)版的。 qgis_core.lib qgis_gui.lib qgis_analysis.lib qtcore.lib

JUC -多线程锁问题:

懵懂的女人 提交于 2020-03-09 06:25:24
多线程锁问题: 8锁现象下名词解释: 顺序执行:先调用的先执行 随机执行:没有规律,与计算机硬件资源有关,哪个线程先得到资源就先执行,各个线程之间互不干扰。 多个线程使用同一把锁- 顺序执行 多个线程使用同一个对象,多个线程就是使用一把锁,先调用的先执行! public class MultiThreadUseOneLock01 { public static void main ( String [ ] args ) { Mobile mobile = new Mobile ( ) ; // 两个线程使用的是同一个对象。两个线程是一把锁!先调用的先执行! new Thread ( ( ) - > mobile . sendEmail ( ) , "A" ) . start ( ) ; // 干扰 try { TimeUnit . SECONDS . sleep ( 1 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } new Thread ( ( ) - > mobile . sendMS ( ) , "B" ) . start ( ) ; } } // 手机,发短信,发邮件 class Mobile { // 被 synchronized 修饰的方法、锁的对象是方法的调用者、 public