zoukankan      html  css  js  c++  java
  • 【转】线程池与工作队列

    原文地址:http://sunnylocus.iteye.com/blog/223327

    程池的作用:

    线程池作用就是限制系统中执行线程的数量。
    根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。

    为什么要用线程池:

    1. 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
    2. 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)

    线程池代码:

      

    测试用例代码:

      

    运行结果:

    View Code
     1 工作线程0等待任务...
     2 工作线程1等待任务...
     3 工作线程2等待任务...
     4 
     5 工作线程0开始执行任务...
     6 Hello world
     7 工作线程0等待任务...
     8 
     9 工作线程1开始执行任务...
    10 Hello world
    11 工作线程1等待任务...
    12 
    13 工作线程2开始执行任务...
    14 Hello world
    15 工作线程2等待任务...
    16 
    17 工作线程0开始执行任务...
    18 Hello world
    19 工作线程0等待任务...
    20 
    21 工作线程1开始执行任务...
    22 Hello world
    23 工作线程1等待任务...
    24 
    25 工作线程2开始执行任务...
    26 Hello world
    27 工作线程2等待任务...

    ——————————————————————以上是转贴的原文————————————————————————————————————————ThreadGroup 介绍

    Class ThreadGroup

    属于 java.lang.ThreadGroup

    线程组是代表一组线程的集合。此外,一个线程组还可以包括其他的线程组。线程组构成一棵树,除了初始线程组的线程组,其中每有一个父。

    允许一个线程访问其自己的线程组的信息,但不能访问有关其线程组的父线程组或任何其他线程组的信息。

    每一个线程产生时,都会被归入某个线程组,视线程是在哪个线程组中产生而定。如果没有指定,则归入产生该子线程的线程组中。您也可以自行指定线程组,线程一旦归入某个组,就无法更换组。

    java.lang.ThreadGroup类正如其名,可以统一管理整个线程组中的线程,您可以使用以下方式来产生线程组,而且一并指定其线程组:

    ThreadGroup threadGroup1 = new ThreadGroup("group1");
    ThreadGroup threadGroup2 = new ThreadGroup("group2");
    Thread thread1 =
    new Thread(threadGroup1, "group1's member");
    Thread thread2 =
    new Thread(threadGroup2, "group2's member");

    ThreadGroup中的某些方法,可以对所有的线程产生作用,例如interrupt()方法可以interrupt线程组中所有的线程,setMaxPriority()方法可以设置线程组中线程所能拥有的最高优先权(本来就拥有更高优先权的线程不受影响)。

    如果您想要一次获得线程组中所有的线程来进行某种操作,可以使用enumerate()方法,例如:

    Thread[] threads = new Thread[threadGroup1.activeCount()];
    threadGroup1.enumerate(threads);

    activeCount()方法获得线程组中正在运行的线程数量,enumerate()方法要传入一个Thread数组,它将线程对象设置到每个数组字段中,然后就可以通过数组索引来操作这些线程。

    ThreadGroup中有一个uncaughtException()方法。当线程组中某个线程发生Unchecked exception异常时,由执行环境调用此方法进行相关处理,如果有必要,您可以重新定义此方法,直接使用范例ThreadGroupDemo.java来示范如何实现。

    范例ThreadGroupDemo.java

    package onlyfun.caterpillar;
    import java.io.*;
    public class ThreadGroupDemo {
    public static void main(String[] args) {
    ThreadGroup threadGroup1 =
    // 这是匿名类写法
    new ThreadGroup("group1") {
    // 继承ThreadGroup并重新定义以下方法
    // 在线程成员抛出unchecked exception
    // 会执行此方法
    public void uncaughtException(Thread t, Throwable e) {
    System.out.println(t.getName() + ": "
    + e.getMessage());
    }
    };
            // 这是匿名类写法
    Thread thread1 =
    // 这个线程是threadGroup1的一员
    new Thread(threadGroup1,
    new Runnable() {
    public void run() {
    // 抛出unchecked异常
    throw new RuntimeException("测试异常");
    }
    });
            thread1.start();
    }
    }

    在uncaughtException()方法的参数中,第一个参数可以获得发生异常的线程实例,而第二个参数可以获得异常对象,范例中显示了线程的名称及异常信息,结果如下所示:

    Thread-0: 测试异常
  • 相关阅读:
    微信开放平台扫码登录回调后 state 参数丢失遗漏的解决方案
    WPF 图片源为空时展示默认图片
    使用批处理(.bat)文件一键编译 .NET CORE 网站并发布至 IIS
    10倍程序员的思考模型
    以TiDB热点问题来谈Region的调度流程
    Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel的解决办法(react Hooks)
    react+tsx+antd表格点击行触发单选复选事件(类型xx上不存在属性xx的解决办法)
    does not exist on type 'JSX.IntrinsicElements'.does not exist on type 'JSX.IntrinsicElements'.的解决办法
    antd-react自定义显示表格操作按钮
    react+tsx+antd关于表单二次弹框
  • 原文地址:https://www.cnblogs.com/ainubis/p/3985888.html
Copyright © 2011-2022 走看看