`

线程的数量控制

 
阅读更多
在编程中,往往都需要采用线程来提高速度,但线程并不是越多越好。
1. 线程越多,JVM 所占资源越多
2. 线程越多,越容易造成资源冲突,如果处理不当,造成死锁。
所以,在启动线程的时候要根据应用程序的特点限制线程的数量。
本程序采用了java.util.concurrent的锁进行线程数量控制,测试代码如下:
/**
 * 专注互联网,分享创造价值
 *  maoxiang@gmail.com
 */
package cn.jteam.app.taobao.spider;
import java.net.InetAddress;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
 *
 *  作用:
 */
public class TestThreadLock {
   
    private Lock lock = new ReentrantLock();
    final Condition full = lock.newCondition();
    final CountDownLatch startSignal = new CountDownLatch(1);
    private int threads;
    CountDownLatch signal = new CountDownLatch(5);
    public void addThreads() throws Exception {
        lock.lock();
        try {
            if (threads > 5) {
                full.await();
            }
            threads++;
        } finally {
            lock.unlock();
        }
    }
    public void removeThreads() {
        lock.lock();
        try {
            if (threads <= 5) {
                full.signal();
            }
            threads--;
        } finally {
            lock.unlock();
        }
    }
    /**
     * 测试线程
     * @throws Exception
     */
    public void run() throws Exception {
        for (int i = 0; i < 10; i++) {
            addThreads();
            final int j = i;
            (new Thread() {
                @Override
                public void run() {
                    try {
                        sleep(500);
                        System.out.println("current " + j + "=" + threads);
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        removeThreads();
                        if (threads == 0) {
                            startSignal.countDown();
                        }
                    }
                }
            }).start();
        }
        startSignal.await();
    }
    public static void main0(String[] args) throws Exception {
        System.out.println("begin");
        TestThreadLock test = new TestThreadLock();
        test.run();
        System.out.println("end..........");
    }
     
}

输入结果为:
begin
current 1=6
current 0=6
current 5=5
current 3=4
current 4=4
current 2=4
current 7=4
current 6=3
current 8=3
current 9=3
end..........


这个程序里,限制了线程的数量为5,但线程超过5个时,就排队等待。
分享到:
评论

相关推荐

    基于golang实现的域名存活检测,支持多携程+单独url扫描+存活域名文件输出+线程数量控制+超时时间控制+源码+项目代码解析

    基于golang实现的域名存活检测,支持多携程+单独url扫描+存活域名文件输出+线程数量控制+超时时间控制+源码+项目代码解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延...

    易语言多线程控制:信号量控制线程数量

    本篇文章将深入探讨易语言中的多线程控制,特别是如何通过信号量来限制同时运行的线程数量,以实现更精细的并发控制。 信号量(Semaphore)是一种经典的同步机制,用于控制对共享资源的访问。在易语言中,我们可以...

    易语言多线程控制线程数量源码

    本篇将深入探讨易语言中如何实现多线程控制以及线程数量的管理。 在易语言中,线程用于在单个进程中同时执行多个独立的代码段,从而提高程序的执行效率。创建线程的基本步骤包括定义线程函数、创建线程对象和启动...

    iOS控制多线程任务数量

    本文将详细讲解如何使用GCD来控制多线程任务的数量,并以`ZKRGlobalQueue^()`为例进行说明。 GCD的基础概念: 1. 队列:GCD中的队列分为串行队列和并行队列。串行队列会按照任务的添加顺序逐一执行,而并行队列则...

    Java多线程示例之线程控制

    本示例主要探讨了如何通过两种方法来控制Java中的线程数量,以达到优化性能和防止内存不足的目的。 首先,我们来看自定义线程池方法实现线程数控制的例子。线程池(ThreadPool)是Java并发编程中非常重要的概念,它...

    JAVA技巧(Java多线程运行时,减少内存占用量).pdf

    本文介绍了在Java多线程环境下减少内存占用量的一些关键策略,包括线程生命周期管理、对象生命周期设计、同步机制选择、线程池的使用和线程数量控制。同时,代码的异常处理和JVM参数调优也是提升多线程应用性能的...

    网站安全狗

    网站安全狗具备六大核心功能: 1、智能的网页木马和网页挂马扫描引擎,及时发现和清除木马文件。... 5、文件下载多线程数量控制,保护服务器流量资源。 6、URL长度、URL后缀漏洞检测,保护服务器安全。

    android多线程断点续传下载

    - 线程数量控制:过多的线程可能导致CPU过度消耗,应合理设定线程数量。 - 网络适应性:根据网络状况动态调整下载速度和线程数。 理解这些知识点并能实际应用,开发者就能构建出功能完善的Android多线程断点续传...

    Linux多线程实现令牌桶流量控制

    本文将深入探讨如何在Linux环境下利用多线程技术来实现令牌桶流量控制。 首先,我们要理解令牌桶算法的基本原理。令牌桶算法是一个允许突发数据传输并同时保持平均传输速率的机制。桶中存储一定数量的令牌,只有当...

    Java多线程与线程安全实践-基于Http协议的断点续传.zip

    1. 线程数量控制:过多的线程会增加系统开销,应适当限制线程数量。 2. 错误处理:考虑网络中断、服务器错误等情况,确保断点续传的健壮性。 3. 并行与串行:根据网络条件选择合适的下载策略,例如在网络不稳定时,...

    易语言-易语言多线程控制线程数量

    3. 线程控制:控制线程数量包括两方面,一是限制最大并发线程数,二是动态调整线程数量。可以通过计数变量来跟踪当前活动的线程数,当达到预设的最大值时,新创建的线程会被阻塞,直到其他线程结束。动态调整则根据...

    C#实现控制线程池最大数并发线程

    在处理高并发任务时,合理控制线程池中的并发线程数量至关重要,以确保系统资源得到充分利用,同时避免过度消耗导致性能瓶颈或崩溃。 在标题和描述中提到的场景,我们需要实现一个功能,即限制线程池中并发执行的...

    多线程下载

    - **线程数量控制**:过多的线程可能会导致服务器压力过大,甚至被服务器视为攻击。因此,需要根据服务器的承受能力合理设置线程数量。 - **带宽管理**:多线程下载可能会占用大量的网络带宽,可能会影响到其他网络...

    C++实现线程池源文件

    - **线程数量控制**:线程池通常有一个最大线程数限制,防止过多线程导致系统资源耗尽。 3. **C++线程库**: - `&lt;thread&gt;`库提供了`std::thread`类,用于创建和管理线程。`std::thread::joinable()`检查线程是否...

    android 多线程下载

    - **线程数量控制**:根据设备性能和网络状况合理设定并发线程数,避免过度消耗资源。 - **动态调整**:根据网络环境变化,动态调整下载策略,如在网络不稳定时降低线程数。 - **优先级调度**:根据任务优先级和...

    深入浅出Win32多线程程序设计之线程控制

    信号量可以控制同时访问资源的线程数量;临界区是轻量级的同步机制,适用于小范围的共享数据。 线程优先级: Windows系统允许设置线程的优先级,通过`SetThreadPriority`函数可以调整线程的执行优先级。不过需要...

    四种线程同步控制方法介绍

    ### 四种线程同步控制方法详解 #### 引言 在并发编程中,线程同步是至关重要的一环。为了防止多个线程间因访问共享资源导致的数据不一致或者竞态条件等问题,需要采取有效的方法来进行同步控制。本文将详细介绍四种...

    C#线程控制

    - **Semaphore**:信号量,限制同时访问资源的线程数量。 - **Monitor**:基于对象锁的同步,使用Enter/Exit方法或using Monitor语句块。 - **Lock语句**:提供了一种简单的同步机制,确保代码块在同一时刻只被一...

    易语言源码易语言多线程高级控制源码.rar

    开发者需要根据任务特性选择合适的线程数量,避免过度使用导致系统负担过重。 通过学习和分析"易语言多线程高级控制源码",开发者不仅可以了解易语言的多线程编程基础,还能深入理解如何在实际项目中应用多线程技术...

Global site tag (gtag.js) - Google Analytics