线程阻塞

Android第十九天

会有一股神秘感。 提交于 2020-04-07 10:53:34
一:进程与线程 进程:进程是程序的一次运行过程。进程是操作系统分配资源和调度的基本单位。 线程:线程是程序的一条执行路径。 一个进程至少包含一个线程。 引入多线程的必要性:多个线程的切换开销小,可以实现并发(宏观上一起执行)执行的效果。 二:实现多线程的方式 1.继承Thread类,复写run()方法。在run()方法里实现线程的操作。 使用start()方法启动线程。 2.实现Runnable接口,复写run()方法。使用start()方法启动线程。 public Thread(Runnable target,String name) 实现Runnable接口实现多线程的好处: 1.可以避免Java的“单继承”缺陷。 2.可以实现资源共享。 三:线程中的常用方法 public Thread(String name) public Thread(Runnable target,String name) 1.getName() 返回该线程的名称。 2.public static Thread currentThread() 返回对当前正在执行的线程对象的引用。 3.public static void sleep(long millis) 线程休眠指定的毫秒数 4.setPriority(int newPriority) 优先级高的不一定先执行。 (不靠谱) 5.public

C#线程暂停和继续操作

荒凉一梦 提交于 2020-04-07 10:39:56
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace XCZT { public partial class Form1 : Form { public Form1() { InitializeComponent(); Label.CheckForIllegalCrossThreadCalls = false; } ManualResetEvent ma = new ManualResetEvent(false); bool stop = false; //启动 private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(Runtime); stop = false; ma.Set();// 信号打开,不阻塞当前线程 thread.Start

JAVA线程池以及队列拒绝策略

独自空忆成欢 提交于 2020-04-07 10:31:15
工作中遇到了消息队列的发送,之前都是用数据库作为中转和暂存的。这次考虑用多线程的方式进行消息的发送,于是学习了一下线程池的应用。说实话,实践中对Java高级特性的应用真的不多,对多线程的理解也就一直停留在理论层面。借着实践的机会好好整理一下。 准备从以下几个方面总结: 线程池的使用 消息队列——生产者消费者模式 定时任务Quartz原理 线程池的大小、队列大小设置 这个部分是有关线程池的使用: 1. 为什么要用线程池? 在Java中,如果每当一个请求到达就创建一个新线程,开销是相当大的。在实际使用中,每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源,甚至可能要比花在实际处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个JVM中创建太多的线程,可能会导致系统由于过度消耗内存或者“切换过度”而导致系统资源不足。为了防止资源不足,服务器应用程序需要一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务,这就是“池化资源”技术产生的原因。 线程池主要用来解决线程生命周期开销问题和资源不足问题,通过对多个任务重用线程,线程创建的开销被分摊到多个任务上了,而且由于在请求到达时线程已经存在,所以消除了创建所带来的延迟。这样

线程之线程终止

ε祈祈猫儿з 提交于 2020-04-07 10:18:19
如果进程中的任一线程调用了exit、_Exit或者_exit,那么整个进程就会终止。与此类似,如果信号的默认动作是终止进程,那么,把该信号发送到线程会终止整个进程。 单个线程可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流。 (1)线程只是从启动例程中返回,返回值是线程的退出码。 (2)线程可以被同一进程中的其他线程取消。 (3)线程调用pthread_exit。 #include <pthread.h> void pthread_exit(void *rval_ptr); rval_ptr是一个无类型指针,与传给启动例程的单个参数类似。进程中的其他线程可以通过调用pthread_join函数访问到这个指针。 #include <pthread.h> int pthread_join(pthread_t thread, void **rval_ptr); 返回值:若成功则返回0,否则返回错误编号 调用线程将一直阻塞,直到指定的线程调用pthread_exit、从启动例程中返回或者被取消。如果线程只是从它的启动例程返回,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元就置为PTHREAD_CANCELED。 可以通过调用pthread_join自动把线程置于分离状态,这样资源就可以恢复。如果线程已经处于分离状态,pthread

Linux线程基础函数

主宰稳场 提交于 2020-04-07 10:17:58
1. 线程标识: (1) 比较两个线程ID; #include <pthread.h> int pthread_equal(pthread_t tid1, pthread_t tid2); ret-若相等则返回非0值,否则返回0值 (2) 获取线程自身ID; #include <pthread.h> pthread_t pthread_self(void); ret-调用线程的线程ID 2. 线程的创建: #include <pthread.h> int pthread_create(pthread_t *restrict tidp, //返回线程的ID           const pthread_attr_t *restrict attr, //线程属性,默认为NULL void *(*start_rtn)(void), //线程函数入口地址 void *restrict arg); //参数 ret-成功返回0 失败返回错误编号 3. 线程的终止: (1) 线程只是从启动例程中返回,返回值是线程的退出码; (2) 线程可以被同一例程中的其他线程取消; (3) 线程调用pthread_exit。 #include <pthread.h> void pthread_exit(void *rval_ptr); rval_ptr是一个无类型指针,与传递给启动例程的单个参数类似

清明花了几天总结了多线程的知识点

家住魔仙堡 提交于 2020-04-07 09:53:11
前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star : https://github.com/ZhongFuCheng3y/3y 在上周总结了一篇「工作中常用到的Java集合类」,反响还不错。这周来写写Java另一个重要的知识点:「 多线程 」 多线程大家在初学的时候,对这个知识点应该有不少的疑惑的。我认为主要原因有两个: 多线程在初学的时候不太好学,并且一般写项目的时候也很少用得上(至少在初学阶段时写的项目基本不需要自己创建线程)。 多线程的知识点在面试经常考,多线程所涉及的知识点非常多,难度也不低。 这就会给人带来一种感觉「 这破玩意涉及的东西是真的广,平时也不怎么用,怎么面试就偏偏爱问这个鬼东西 」 不多BB,我要开始了。 为什么使用多线程? 首先,我们要明确的是「为什么要使用多线程」,可能有人会认为「 使用多线程就是为了加快程序运行的速度啊 」。如果你是这样回答了,那面试官可能会问你「那多线程是怎么加快程序运行速度的?」 于我的理解:使用多线程最主要的原因是 提高系统的资源利用率 。 现在CPU基本都是多核的,如果你只用单线程,那就是只用到了一个核心,其他的核心就相当于空闲在那里了。 厕所的坑位有5个,如果只用一个坑位,那不是很亏?比如现在我有5个人要上厕所。 在单线程的时候:进去一个人解决要10分钟,然后后面的人都得等一个坑位

多线程学习笔记一

戏子无情 提交于 2020-04-07 02:25:23
关于线程的常见问题- 什么是并发与并行? 并行:两个或者多个事件在同一时刻发生 并发:两个或者多个事件在同一个时间段内发生 什么是进程与线程? 进程是正在运行的程序的实例 进程是线程的容器,一个进程可以开启多个线程 比如打开一个浏览器,会创建进程 线程如何创建? 继承Thread类 实现Runnable接口 实现Callable接口鸭 从线程池-Excutor 获取线程 实现类接口和继承类接口的比较:    接口更适合多个相同的程序代码去共享同一个资源   接口可以避免java中单继承的局限性   接口代码可以被多个线程共享,代码和线程独立   线程池只能 放入实现Runnable和Callable接口的线程,不能直接放入继承Thread的线程    java中,每次运行程序至少启动2个线程,一个是main线程,一个是垃圾收集线程 线程的生命周期? 什么是线程安全问题?线程安全问题解决方案? 线程安全问题都是由全局变量及静态变量引起的 若每个线程对全局变量,静态变量只读,不写,则这个变量是线程安全的 若有多个线程同时执行写操作,则需要考虑线程同步,否则就可能影响线程安全      解决方案 :线程同步 - 只要在某个线程修改共享资源的时候,其他线程不能修改该资源,等待修改完毕同步之后,才能去抢夺资源,完成对应的操作,保证了数据的同步性。 java引入了7种同步机制: 同步代码块

Python数据库连接池DBUtils

梦想的初衷 提交于 2020-04-06 21:26:11
DBUtils是Python的一个用于实现数据库连接池的模块。 下载地址 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接自动关闭。 POOL = PersistentDB( creator=pymysql, # 使用链接数据库的模块 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."] ping=0, # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always closeable=False, # 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接

Python数据库连接池DBUtils

我们两清 提交于 2020-04-06 21:21:37
DBUtils是Python的一个用于实现数据库连接池的模块。 此连接池有两种连接模式:   模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接自动关闭。 POOL = PersistentDB( creator=pymysql, # 使用链接数据库的模块 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."] ping=0, # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always closeable=False, # 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接

线程:安全终止与重启

痞子三分冷 提交于 2020-04-06 20:16:40
之前在一篇文章中提到过线程的安全终止的方法,大致的意思就是自定义一个boolean 类型的 volatile 变量,通过控制这个变量来终止线程。 class UiThread extends Thread { private volatile boolean isRun = true; @Override public void run() { while (isRun) { //你的操作 } } public void close() { isRun = false; } } 但是这种做法有个弊端,那就是这种终止方法的实时性很低。 如果在while里面的代码执行时间很长,比如需要10分钟,但是在这10分钟内,调用了close方法,isRun变成了false,可是这时候程序运行到while括号里面的代码段,只有运行完这个括号里面的代码段,才会判断isRun,这样从调用close进行终止,到程序实际终止的时延很大,对于一些实时性要求高,或则是事务类型的操作这样显然是不行的。 因此,本文再介绍一种实时性比较好的做法,使用interrupt,以前也一直没看明白,今天总算搞懂了。。。 首先,看看 Thread的interrupt方法解释:   void java.lang.Thread.interrupt() Posts an interrupt request to this