线程阻塞

HttpClient 教程 (二)

 ̄綄美尐妖づ 提交于 2020-03-20 23:46:45
转自:http://www.cnblogs.com/loveyakamoz/archive/2011/07/21/2112832.html 第二章 连接管理 HttpClient有一个对连接初始化和终止,还有在活动连接上I/O操作的完整控制。而连接操作的很多方面可以使用一些参数来控制。 2.1 连接参数 这些参数可以影响连接操作: 'http.socket.timeout':定义了套接字的毫秒级超时时间(SO_TIMEOUT),这就是等待数据,换句话说,在两个连续的数据包之间最大的闲置时间。如果超时时间是0就解释为是一个无限大的超时时间。这个参数期望得到一个java.lang.Integer类型的值。如果这个参数没有被设置,那么读取操作就不会超时(无限大的超时时间)。 'http.tcp.nodelay':决定了是否使用Nagle算法。Nagle算法视图通过最小化发送的分组数量来节省带宽。当应用程序希望降低网络延迟并提高性能时,它们可以关闭Nagle算法(也就是开启TCP_NODELAY)。数据将会更早发送,增加了带宽消耗的成文。这个参数期望得到一个java.lang.Boolean类型的值。如果这个参数没有被设置,那么TCP_NODELAY就会开启(无延迟)。 'http.socket.buffer-size':决定了内部套接字缓冲使用的大小,来缓冲数据同时接收/传输HTTP报文

HttpClient 教程 (二)

强颜欢笑 提交于 2020-03-20 23:46:15
第二章 连接管理 HttpClient有一个对连接初始化和终止,还有在活动连接上I/O操作的完整控制。而连接操作的很多方面可以使用一些参数来控制。 2.1 连接参数 这些参数可以影响连接操作: 'http.socket.timeout':定义了套接字的毫秒级超时时间(SO_TIMEOUT),这就是等待数据,换句话说,在两个连续的数据包之间最大的闲置时间。如果超时时间是0就解释为是一个无限大的超时时间。这个参数期望得到一个java.lang.Integer类型的值。如果这个参数没有被设置,那么读取操作就不会超时(无限大的超时时间)。 'http.tcp.nodelay':决定了是否使用Nagle算法。Nagle算法视图通过最小化发送的分组数量来节省带宽。当应用程序希望降低网络延迟并提高性能时,它们可以关闭Nagle算法(也就是开启TCP_NODELAY)。数据将会更早发送,增加了带宽消耗的成文。这个参数期望得到一个java.lang.Boolean类型的值。如果这个参数没有被设置,那么TCP_NODELAY就会开启(无延迟)。 'http.socket.buffer-size':决定了内部套接字缓冲使用的大小,来缓冲数据同时接收/传输HTTP报文。这个参数期望得到一个java.lang.Integer类型的值。如果这个参数没有被设置

爬虫之线程&协程&异步

空扰寡人 提交于 2020-03-20 23:23:55
线程池 导包: from multiprocessing.dummy import Pool 回调函数异步将可迭代对象中的元素进行某种操作 注意事项:callback必须有一个参数,且只能有一个参数 异步主要是被应用在耗时的操作 from multiprocessing.dummy import Pool pool = Pool(3) # 实例化线程池对象,3是线程池的最大线程数 # 参数1:回调函数(只是函数名,不加括号);参数2:列表 # 参数1会接收参数2列表中的某一个元素,回调函数可以对该列表元素进行某种操作 pool.map(callback,list) 测试:同步&异步效率 搭建一个flask,自己启动服务,测试执行时间 新建一个 server.py from flask import Flask, render_template import time app = Flask(__name__) @app.route('/xx') def index_1(): time.sleep(2) return render_template('test.html') @app.route('/yy') def index_2(): time.sleep(2) return render_template('test.html') @app.route('/oo') def

.NET提供了哪几个定时器类型

一笑奈何 提交于 2020-03-20 20:30:34
分析问题   在.NET内建类型中,一共为程序员提供了3种定时器:   1、System.Windows.Forms.Timer类型。   2、System.Threading.Timer类型。   3、System.Timers.Timer类型。   概况来说,这三种类型都实现了定时的功能。程序员通常需要做的是为定时器设置一个间断时间,设置定时到达时的处理方法,然后就可以等待定时器不断地计时和触发处理事件,现在笔者来分别介绍一下这三种类型的特点。   1、System.Windows.Forms.Timer类型   从这个定时器的命名空间可以看出,.NET设计这个类型的目的是为了方便程序员在Windows界面上使用定时器。当一个System.Windows.Forms.Timer类型被构造时,当前定时器会和当前线程进行关联。而当定时器的计时到达后,一个定时器消息将被插入到当前线程的消息队列中。当前线程将逐一处理消息队列中的所有消息,并一一派发给各自的处理方法。这样的机制和利用工作者线程进行定时有很大的区别,事实上,System.Windows.Forms.Timer类型并没有涉及多线程的操作,定时器的设置、定时方法的执行都在同一个线程上。 注意   这就意味着System.Windows.Forms.Timer并不能准确地定时,事实上,当消息阻塞时,定时器的误差将相当大

C++11并发——多线程条件变量std::condition_variable(四)

人走茶凉 提交于 2020-03-20 18:28:29
https://www.jianshu.com/p/a31d4fb5594f https://blog.csdn.net/y396397735/article/details/81272752 https://www.cnblogs.com/haippy/p/3252041.html std::condition_variable 是条件变量, 当 std::condition_variable 对象的某个 wait 函数被调用的时候,它使用 std::unique_lock(通过 std::mutex) 来锁住当前线程。 当前线程会一直被阻塞,直到另外一个线程在相同的 std::condition_variable 对象上调用了 notification 函数来唤醒当前线程。 std::condition_variable 对象通常使用 std::unique_lock<std::mutex> 来等待,如果需要使用另外的 lockable 类型,可以使用 std::condition_variable_any 类,本文后面会讲到 std::condition_variable_any 的用法。 #include <iostream> // std::cout #include <thread> // std::thread #include <mutex> // std:

原子操作类AtomicInteger详解

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-20 08:08:13
为什么需要AtomicInteger原子操作类? 对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。测试代码如下: public class AtomicIntegerTest { private static final int THREADS_CONUT = 20; public static int count = 0; public static void increase() { count++; } public static void main(String[] args) { Thread[] threads = new Thread[THREADS_CONUT]; for (int i = 0; i < THREADS_CONUT; i++) { threads[i] = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 1000; i++) { increase(); } } }); threads[i].start(); } while (Thread.activeCount() > 1) {

原子操作类AtomicInteger详解

谁说我不能喝 提交于 2020-03-20 08:08:00
为什么需要AtomicInteger原子操作类? 对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。测试代码如下: public class AtomicIntegerTest { private static final int THREADS_CONUT = 20; public static int count = 0; public static void increase() { count++; } public static void main(String[] args) { Thread[] threads = new Thread[THREADS_CONUT]; for (int i = 0; i < THREADS_CONUT; i++) { threads[i] = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 1000; i++) { increase(); } } }); threads[i].start(); } while (Thread.activeCount() > 1) {

ConcurrentHashMap源码解析(1.8)

末鹿安然 提交于 2020-03-20 07:58:47
一、简介 上篇文章 详细介绍了HashMap的源码及原理,本文趁热打铁继续分析ConcurrentHashMap的原理。 首先在看本文之前,希望对HashMap有一个详细的了解。不然看直接看ConcurrentHashMap的源码还是有些费劲的。 相信对HashMap,HashTable有一定了解,应该知道HashMap是不具备线程安全性的,在resize时会丢数据(JDK8),而HashTable虽然保证了线程安全性,但是其是通过给每个方法加Synchronized关键字达到的同步目的。但是都知道Synchronized在竞争激烈的多线程并发环境中,在性能上的表现是非常不如人意的。那在高并发环境中HashMap如何保证线程安全而又不浪费太多性能呢?答案就是Java J.U.C并发包中的ConcurrentHashMap。 依然开局一张图。JDK8中的ConcurrentHashMap数据结构。 呃呵,和HashMap的结构是一样的,没错在数据结构层面,ConcurrentHashMap和HashMap是完全一样的。有了这个基础继续往下看。 二、历史版本 ConcurrentHashMap的历史版本大致分界线在JDK8。也就是可以分为JDK8和JDK8以前版本。 数据结构的区别 在JDK8之前HashMap没有引入红黑树,同样的ConcurrentHashMap也没有引入红黑树

[读书笔记]《Effective Java》第10章并发

回眸只為那壹抹淺笑 提交于 2020-03-20 07:44:06
第66条:同步访问共享的可变数据 同步的意义。 正确地使用同步可以保证没有任何方法会看到对象处于不一致的状态中。 进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有的修改效果。 Java语言规范保证读或者写一个变量是原子的,除非这个变量的类型为long或者double。 对于原子数据的读取,Java语言规范并不保证一个线程写入的值对于另一个线程将是可见的。 对于共享的数据,即使数据是原子可读写的,也要使用同步。 活动性失败:因为JVM的优化,部分代码无法执行。 1 /** 2 * 共享原子可读写的变量不使用同步访问. 3 * Created by itlivemore on 17-7-1. 4 */ 5 public class StopThread { 6 private static boolean stopThread; 7 8 public static void main(String[] args) throws InterruptedException { 9 Thread backGroundThread = new Thread(new Runnable() { 10 @Override 11 public void run() { 12 int i = 0; 13 while (!stopThread) { 14 System.out

【JUC】JDK1.8源码分析之ReentrantLock(三)

你。 提交于 2020-03-20 03:44:15
一、前言   在完成Map下的并发集合后,现在来分析ArrayBlockingQueue,ArrayBlockingQueue可以用作一个阻塞型队列,支持多任务并发操作,有了之前看源码的积累,再看ArrayBlockingQueue源码会很容易,下面开始正文。 二、ArrayBlockingQueue数据结构   通过源码分析,并且可以对比ArrayList可知,ArrayBlockingQueue的底层数据结构是数组,数据结构如下   说明:ArrayBlockingQueue底层采用数据才存放数据,对数组的访问添加了锁的机制,使其能够支持多线程并发。 三、ArrayBlockingQueue源码分析    3.1 类的继承关系    public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable {}   说明:可以看到ArrayBlockingQueue继承了AbstractQueue抽象类,AbstractQueue定义了对队列的基本操作;同时实现了BlockingQueue接口,BlockingQueue表示阻塞型的队列,其对队列的操作可能会抛出异常;同时也实现了Searializable接口,表示可以被序列化。