线程

windows 常用thread方法

故事扮演 提交于 2020-03-23 02:09:28
3 月,跳不动了?>>> 1.HANDLE CreateThread( _In_opt_LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_SIZE_T dwStackSize, _In_LPTHREAD_START_ROUTINE lpStartAddress, _In_opt___drv_aliasesMemLPVOID lpParameter, _In_DWORD dwCreationFlags, _Out_opt_LPDWORD lpThreadId ); 参数说明 lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE dwStackSize,设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据需要动态延长堆栈的大小。 lpStartAddress,指向线程函数的指针. lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。 dwCreationFlags :线程标志,可取值如下 (1)CREATE

PostThreadMessage

為{幸葍}努か 提交于 2020-03-23 02:06:06
3 月,跳不动了?>>> 函数功能:该函数将一个消息放入 (寄送)到指定线程的消息队列里,不等待线程处理消息就返回。 函数原型:BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM IParam); 参数 idThread:其消息将被寄送的线程的 线程标识符。如果线程没有消息队列,此函数将失败。当线程第一次调用一个Win 32 USER或GDI函数时,系统创建线程的消息队列。要得到更多的信息,参见备注。 Msg:指定将被寄送的消息的类型。 wParam:指定附加的消息特定信息。 IParam:指定附加的消息特定信息。 返回值:如果函数调用成功,返回非零值。如 果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。如果idThread不是一个有效的线程标识符或由 idThread确定的线程没有消息队 列,GetLastError返回 ERROR_INVALID_THREAD。 备注:消息将寄送到的线程必须创建消息队 列,否则调用PostThreadMessage会失败。用下列方法之一来处理这种情况: 调用PostThreadMessage。 如果失败,调用Sleep,再调用PostThreadMessage,反复执行,直到PostThreadMessage成功。

Java多线程的volatile底层实现原理

瘦欲@ 提交于 2020-03-22 23:41:36
或许你经常被问到? Volatile关键字有何作用? 实现这些作用的底层如何实现? Volatile能够保障可见性、有序性?原子性吗? 前言 我们都知道,Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。 Volatile作用   Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。我们看下面的图来理解。2个CPU都要去操作主存中counter变量时,,他们读取主存中的变量counter到自己cpu cache中,然后操作数据。CPU1改变counter=7的操作,对CPU2是不可见的。 实现可见性 上面的例子,如果我们加上Volatile关键字,实际上底层是这么回事。 1)将当前处理器缓存行的数据写回到系统内存。 2)写回主存的操作会使在其他CPU里缓存了该内存地址的数据无效,其他CPU执行时,就需要重新从主存中获取数据。 实现禁止指令重排序 禁止指令重排序有没有什么例子?可以参考下我的另一篇文章: DCL的单例一定是线程安全的吗 Java内存模型其实是通过内存屏障(Memory Barrier)来实现的禁止指令重排序,

40个Java多线程问题总结

旧城冷巷雨未停 提交于 2020-03-22 20:00:51
40个问题汇总 1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法: (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。 单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了 。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。 (2)防止阻塞 从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了

Callable实现JAVA多线程

空扰寡人 提交于 2020-03-22 19:13:36
最近项目用到一个功能需要实现多线程分发任务且需要任务的返回值,之前一直都是实现Runnable接口,但里面的run方法是返回void的。后来在网上查了下JAVA1.5开始就有了Callable。 下面来看看如何倒腾下这个东西。 import java.util.concurrent.Callable; /** * @类说明 线程业务处理 * @author DavenTsang * @date 2016-11-16 * */ public class PoolTask implements Callable<String> { private String id; @Override public String call() throws Exception { return "当前线程名:" + Thread.currentThread().getName() + ":" + id; } public String getId() { return id; } public void setId(String id) { this.id = id; } } View Code 先建立一个类实现Callable接口。一下是JDK的API对Callable接口的描述: public interface Callable<V> 返回结果并且可能抛出异常的任务

Java多线程同步方法

◇◆丶佛笑我妖孽 提交于 2020-03-22 18:50:35
一、同步方法   即有 synchronized关键字修饰的方法 。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。 注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类。 二、同步代码块   即有synchronized关键字修饰的语句块。 被synchronized关键字修饰的语句块会自动被加上内置锁,从而实现同步 代码如: synchronized(object){ } 注:同步是一种高开销的操作,因此应该尽量减少同步的内容。 通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。 线程在执行同步方法时是具有排它性的。 当任意一个线程进入到一个对象的任意一个 同步方法 时,这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,直到这个线程执行完它所调用的同步方法并从中退出,从而导致它释放了该对象的同步锁之后。 在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有非同步方法的。 同步块:同步块是通过锁定一个指定的对象,来对同步块中包含的代码进行同步; 而同步方法是对这个方法块里的代码进行同步,而这种情况下锁定的对象就是同步方法所属的主体对象自身。如果这个方法是静态同步方法呢

java线程实现方式

北城余情 提交于 2020-03-22 18:25:26
java线程实现方式 首先,单线程理解为一个人,多线程可以理解为多个人,一般情况下,一项任务分配给多个人要比分配给一个人花费的时间短。所以java的多线程就是为了工作起来更快更省时间。 java线程创建的两种方式 继承Thread类 启动线程的唯一方法就是通过Thread类的start()实例方法,start()方法是一个native方法,它将启动一个新线程,并执行run()方法 如下代码 package com.rookie.bigdata.thread; /** * @author rookie * @version 1.0 * @date 2020/3/19 21:16 */ public class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("执行 " + i + name); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } public

线程、进程间通信

我的梦境 提交于 2020-03-22 18:17:06
线程 在无线程的系统中,进程是: 存储器、外设等资源的分配单位 处理机调度的对象 在引入线程后: 线程 是 处理机调度 的对象 进程 作为 资源分配 单位 同一进程内可包含 多个线程 ,他们 共享进程的资源 线程的使用 引入线程的原因: 并行实体 共享同一个地址空间和所有可用数据 的能力 比进程更容易创建、撤销 性能的提高。如果存在着大量的计算和大量的IO处理,多线程允许这些活动 彼此重叠进行 ,加快应用程序执行的速度 多处理机系统,多线程可以真正地并行 例子:文字处理软件 如果程序只有一个线程,那么只要已启动磁盘备份,键盘和鼠标输入的命令都会不予理睬,知道备份结束,用户将感觉到程序反应迟钝 使用三个线程: 一个线程和用户交互 第二个线程在后台重新进行格式处理 第三个线程处理磁盘备份 例子:万维网服务器 Web服务器:接受用户请求,将所请求的页面发回给客户机 多线程实现: 一个线程(分配程序)从网络中读入工作请求,检查请求后,提交给一个工作线程(唤醒睡眠的工作线程) while (true) { get_next_request(&buf); handoff_work(&buf); } 工作线程负责调入页面(读高度缓存或磁盘) while (true) { wait_for_work(&buf); look_for_page_in_cache(&buf, &page); if

进程和线程的区别

Deadly 提交于 2020-03-22 18:14:38
进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。 线程是程序执行时的最小单位,它是进程的一个执行流。 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵 线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多 进程实现 from multiprocessing import Pool import time import random import os def work(msg): start = time.time() print("work{}开始执行,id为{}".format(msg, os.getpid())) time.sleep(random.random()*2) stop = time.time() print("work{}耗时{}.".format(msg, stop-start)) p = Pool() for i in range(10): # 非堵塞运行 p.apply_async(work, args=(i,)) # 堵塞进行 # p.apply(work, args=(i,)) print("开始") p.close() p.join() print("结束") 线程实现

Jmeter的几种参数化方式

萝らか妹 提交于 2020-03-22 17:54:01
一、用户参数 设置方式:添加→前置处理器→用户参数,设置如下: 说明:search_keywords是参数名称,用户_1/用户_2/用户_3是参数的3个值。仅对于多线程时,每个线程会取其中一个值,若线程超过3个,则会重复取这3个值中的一个。若设置为1个线程,则此参数化方法无效。 二、csv data set config 设置方式:添加→配置元件→csv data set config,设置如下: 说明:线程组中,若线程数为1,循环次数设置为3,则会相继取data.txt中的值,发送3次请求 三、 随机函数RandomString 设置方式:选项→函数助手对话框→选择函数为:_RandomString,设置如下: # 说明:第一项为长度,设为2,则会取2个汉字;第二项为可选,建议填上,生成的随机字符串会从这一项中随机选取并组合;第三项可选,可填可不填;最后点击生成,把生成的一堆东西复制粘贴在参数的位置,如下: 这种方式对单线程or多线程没区别 来源: https://www.cnblogs.com/Matilda-221/p/10186266.html