黑马程序员技术交流社区

标题: java怎么生成线程池啊 [打印本页]

作者: 孙政    时间: 2013-4-28 09:41
标题: java怎么生成线程池啊
本帖最后由 孙政 于 2013-5-2 08:45 编辑

java怎么生成线程池,大神们可以详细解释一下吗?
作者: harborbest    时间: 2013-4-28 09:58
线程池的作用:
线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
为什么要用线程池:
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)
一个比较简单的线程池至少应包含线程池管理器、工作线程、任务队列、任务接口等部分。其中线程池管理器(ThreadPool Manager)的作用是创建、销毁并管理线程池,将工作线程放入线程池中;工作线程是一个可以循环执行任务的线程,在没有任务时进行等待;任务队列的作用是提供一种缓冲机制,将没有处理的任务放在任务队列中;任务接口是每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等,工作线程通过该接口调度任务的执行。下面的代码实现了创建一个线程池,以及从线程池中取出线程的操作:
  1. public class ThreadPool
  2. {
  3. private Stack threadpool = new Stack();
  4. private int poolSize;
  5. private int currSize=0;
  6. public void setSize(int n)
  7. {
  8. poolSize = n;
  9. }
  10. public void run()
  11. {
  12. for(int i=0;i<poolSize;i++)
  13. {
  14. WorkThread workthread=new WorkThread();
  15. threadpool.push(workthread);
  16. currSize++;
  17. }
  18. }
  19. public synchronized WorkThread getworker( )
  20. {
  21. if (threadpool.empty())
  22. system.out.println(“stack is empty”);
  23. else
  24. try{ return threadpool.pop();
  25. } catch (EmptyStackException e){}
  26. }
  27. }

复制代码

作者: 郑雪    时间: 2013-4-28 10:21
下面的代码实现了创建一个线程池:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPool {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                // 创建一个可重用固定线程数的线程池  
                ExecutorService pool = Executors.newFixedThreadPool(2);   
                // 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口   
                Thread t1 = new MyThread();   
                Thread t2 = new MyThread();   
                Thread t3 = new MyThread();   
                Thread t4 = new MyThread();  
                Thread t5 = new MyThread();   
                // 将线程放入池中进行执行   
                pool.execute(t1);   
                pool.execute(t2);   
                pool.execute(t3);   
                pool.execute(t4);   
                pool.execute(t5);   
                // 关闭线程池   
                pool.shutdown();  
                }
        }

class MyThread extends Thread {
        public void run(){
               
                System.out.println(Thread.currentThread().getName() + "正在执行。。。");  
        }
}

作者: 袁梦希    时间: 2013-4-28 10:22
郑雪 发表于 2013-4-28 10:21
下面的代码实现了创建一个线程池:
import java.util.concurrent.ExecutorService;
import java.util.concu ...

加油  郑雪
作者: 郑雪    时间: 2013-4-28 10:24
袁梦希 发表于 2013-4-28 10:22
加油  郑雪

哈哈,谢谢哈。
作者: 黄玉昆    时间: 2013-4-28 23:16

如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2