A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王震阳老师 金牌黑马   /  2014-7-15 14:02  /  18176 人查看  /  220 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 就业指导-王震阳老师 于 2014-8-18 11:09 编辑

活动目的:练习javaSE知识,练习查询并使用jdk自带的线程池。

活动奖励:最高3个技术分

结束时间:2014年7月21日,过期提交可能获取不到技术分!

代码提交要求:将自己的源代码压缩然后提交,提交的时候设置为管理员权限,以其他方式提交的答案无效。上交源码的时候不需要将整个工程项目压缩,只需将用到的源文件压缩即可。

题目类型:线程、线程池。

题目:老规矩,回帖领题
游客,如果您要查看本帖隐藏内容请回复

更多技术分活动:
【阳哥专栏】技术分活动第12期
http://bbs.itheima.com/thread-138162-1-1.html

【阳哥专栏】技术分活动第11期
http://bbs.itheima.com/thread-137632-1-1.html
【阳哥专栏】技术分活动第10期
http://bbs.itheima.com/thread-136866-1-1.html
【阳哥专栏】技术分活动第9期
http://bbs.itheima.com/thread-136465-1-1.html
【阳哥专栏】技术分活动第8期
http://bbs.itheima.com/thread-135781-1-1.html
【阳哥专栏】技术分活动第7期
http://bbs.itheima.com/thread-134321-1-1.html
【阳哥专栏】周末技术分活动第6期
http://bbs.itheima.com/thread-132893-1-1.html
【阳哥专栏】周末技术分活动第5期
http://bbs.itheima.com/thread-129859-1-1.html
【阳哥专栏】周末技术分活动第4期
http://bbs.itheima.com/thread-128854-1-1.html
【阳哥专栏】周末技术分活动第3期
http://bbs.itheima.com/thread-127326-1-1.html
【阳哥专栏】周末技术分活动第2期
http://bbs.itheima.com/thread-125800-1-1.html
【阳哥专栏】周末技术分派送活动第1期
http://bbs.itheima.com/thread-123979-1-1.html


220 个回复

倒序浏览
jzxyhjl 发表于 2014-7-15 14:16
线程池 练习的少 试试这个题

可以给大家借鉴一下,写的很好。
  1. package test;

  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. import java.util.concurrent.ScheduledExecutorService;
  5. import java.util.concurrent.TimeUnit;
  6. /**
  7. * 线程池:单个线程池、固定大小的线程池、调度线程池(定时器)
  8. * @author asus
  9. *
  10. */

  11. public class ThreadPollTest {
  12.        
  13.         //测试运行
  14.         public static void main(String[] args) {
  15.                 Resource res = new Resource();
  16.                
  17. //                singleThreadPool(res);
  18. //                fixedThreadPool(res);
  19.                 scheduledThreadPool(res);
  20.         }
  21.        
  22.         //单个线程池,特点是:如果因为异常导致该线程意外终止,那么单个线程池会启动一个新的线程来代替已终止的线程,并且保证一次只启动一个线程
  23.         public static void singleThreadPool(final Resource res){
  24.                 //创建一个单个线程的线程池,用于生产线程
  25.                 ExecutorService producerPool = Executors.newSingleThreadExecutor();
  26.                 //启动线程池,这里需要向线程池提供一个Runnable对象,加入生产方法
  27.                 producerPool.execute(new Runnable(){
  28.                                 public void run(){
  29.                                         while(true){
  30.                                                 res.produce("生产者");
  31.                                         }
  32.                                 }
  33.                         });
  34.                 //同样创建一个单个线程池用于消费
  35.                 ExecutorService consumerPool = Executors.newSingleThreadExecutor();
  36.                 //启动线程池,提供一个Runnable对象,这里启动消费方法
  37.                 consumerPool.execute(new Runnable(){
  38.                                 public void run(){
  39.                                         while(true){
  40.                                                 res.consume("消费者");
  41.                                         }
  42.                                 }
  43.                         });
  44.         }
  45.        
  46.         //创建一个指定大小的线程池,特点:一个固定大小的线程池,如果所有线程都处于活动状态时,在有可用线程之前,其他任务将在队列中等待
  47.         public static void fixedThreadPool(final Resource res){
  48.                 //创建一个线程池,设置其中有4个可用线程
  49.                 ExecutorService pool = Executors.newFixedThreadPool(4);
  50.                 //内部类提供生产方法
  51.                 class Producer implements Runnable{
  52.                         public void run(){
  53.                                 while(true){
  54.                                         res.produce("生产者");
  55.                                 }
  56.                         }
  57.                 }
  58.                 //内部类提供消费方法
  59.                 class Consumer implements Runnable{
  60.                         public void run(){
  61.                                 while(true){
  62.                                         res.consume("消费者");
  63.                                 }
  64.                         }
  65.                 }
  66.                 //启动两个生产线程,两个消费线程
  67.                 pool.execute(new Producer());
  68.                 pool.execute(new Producer());
  69.                 pool.execute(new Consumer());
  70.                 pool.execute(new Consumer());
  71.         }
  72.        
  73.         //创建可调度的线程池,特点:可以设定延迟后运行线程,或者定期执行线程
  74.         public static void scheduledThreadPool(final Resource res){
  75.                 //创建一个可调度的线程池,设置其中有2个可用线程
  76.                 ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
  77.                 //定时生产,调度线程池可以定时执行线程
  78.                 pool.scheduleAtFixedRate(new Runnable(){//设置要执行的任务,这里加入生产任务
  79.                                 public void run(){
  80.                                         res.produce("生产者");
  81.                                 }
  82.                         },
  83.                         0, //设定启动延迟时间,0表示立即启动
  84.                         3, //设定每个3秒执行一次
  85.                         TimeUnit.SECONDS);//设定时间单位为秒
  86.                 //定时消费
  87.                 pool.scheduleAtFixedRate(new Runnable(){//设置要执行的任务,这里加入消费任务
  88.                                 public void run(){
  89.                                         res.consume("消费者");
  90.                                 }
  91.                         },
  92.                         2, //设定启动延迟2秒
  93.                         3, //设定每个3秒执行一次
  94.                         TimeUnit.SECONDS);//设定时间单位为秒
  95.         }

  96. }
  97. //用于多线程执行的对象,生产者消费者的生产消费方法
  98. class Resource{
  99.         //产品数量,初始为0
  100.         private int count = 0;
  101.         //是否生产标志位,默认false,表示没有生产
  102.         private boolean isProduced = false;
  103.        
  104.         //生产方法,需要和消费方法进行同步
  105.         public synchronized void produce(String name){
  106.                 //判断是否已经生产,如果已经生产产品,生产者wait(),等待消费
  107.                 while(isProduced){
  108.                         try {
  109.                                 this.wait();
  110.                         } catch (InterruptedException e) {
  111.                                 e.printStackTrace();
  112.                         }
  113.                 }
  114.                 //表示生产了一个产品
  115.                 count++;
  116.                 //向控制台输出生产结果
  117.                 System.out.println(Thread.currentThread().getName()+"的"+name+":生产第"+count+"个产品");
  118.                 //将标志位设置成true,表示已经生产
  119.                 isProduced = true;
  120.                 //唤醒所有线程,避免都进入等待
  121.                 this.notifyAll();
  122.         }
  123.         //消费方法,需要和生产方法进行同步
  124.         public synchronized void consume(String name){
  125.                 //如果为false,表示没有产品,消费者wait(),等待生产
  126.                 while(!isProduced){
  127.                         try {
  128.                                 this.wait();
  129.                         } catch (InterruptedException e) {
  130.                                 e.printStackTrace();
  131.                         }
  132.                 }
  133.                 //向控制台输出消费结果
  134.                 System.out.println(Thread.currentThread().getName()+"的"+name+":消费第"+count+"个产品");
  135.                 //将标志位设置成false,表示已经消费
  136.                 isProduced = false;
  137.                 //唤醒所有线程,避免都进入等待
  138.                 this.notifyAll();
  139.         }
  140. }
复制代码
回复 使用道具 举报
姿_`态 发表于 2014-12-15 21:15
阳哥,我来看题啦啦

提交答案的时候记得提交截图。
回复 使用道具 举报

写的很好:
  1. /*
  2. 需求:
  3.         通过查询JDK自带的线程池,学习线程池的使用方法。
  4.         并做以下练习:通过从线程池中获取的线程执行一个多线程任务(任务自定义)。
  5.         想得满分,至少得写出两种线程池的用法,并附带详细的注释。

  6. 查阅api
  7.         newFixedThreadPool
  8.                 public static ExecutorService newFixedThreadPool(int nThreads)创建一个可重用固定线程数的线程池,
  9.                 以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。
  10.                 如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。
  11.                 如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。
  12.                 在某个线程被显式地关闭之前,池中的线程将一直存在。
  13.         newScheduledThreadPool
  14.                 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)创建一个线程池,
  15.                 它可安排在给定延迟后运行命令或者定期地执行。

  16.                 参数:
  17.                 corePoolSize - 池中所保存的线程数,即使线程是空闲的也包括在内。
  18.                 返回:
  19.                         新创建的安排线程池
  20. 思路:
  21.         1.定义一个专门用于操作线程池的类
  22.                 类中定义两个方法,分别是线程池的用法
  23.                 通过查阅api文档,书写线程池用噶
  24.         2.在main方法,中创建对象, 调用这两个方法
  25. */
  26. import java.util.concurrent.ExecutorService;
  27. import java.util.concurrent.Executors;
  28. import java.util.concurrent.ScheduledExecutorService;
  29. import java.util.concurrent.TimeUnit;

  30. class ThreadPool
  31. {
  32.         public static void main(String[] args)
  33.         {
  34.                 ThreadPool tp = new ThreadPool();
  35.                 tp.fixedThreadPool();
  36.                 try{Thread.sleep(1000);}catch(Exception e){}
  37.                 tp.scheduledThreadPool();
  38.                
  39.         }
  40.         public  void fixedThreadPool(){
  41.                 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);//创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。这里设定的线程数是2
  42.                   for (int i = 0; i < 8; i++) {
  43.                    final int number = i;
  44.                    fixedThreadPool.execute(new Runnable() {//执行execute(Runnable command)  在将来某个时间执行给定任务。任务代码如下run方法中
  45.                         public void run() {
  46.                          try {
  47.                           System.out.println("fixedThreadPool..两个一起执行"+number);
  48.                           Thread.sleep(1000);
  49.                          } catch (InterruptedException e) {
  50.                           fixedThreadPool.shutdown();
  51.                           e.printStackTrace();
  52.                          }
  53.                         }
  54.                    });
  55.                   }
  56.        
  57.         }
  58.         public  void scheduledThreadPool(){
  59.                 ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);// 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。这里延迟的时间设为1

  60.                   for (int i = 0; i < 8; i++) {
  61.                    final int number = i;
  62.                    scheduler.schedule(new Runnable() {//schedule(Runnable command, long delay, TimeUnit unit) 创建并执行在给定延迟后启用的一次性操作。操作的代码如下run方法中run方法中
  63.                           
  64.             public void run() {
  65.                          try {
  66.                                
  67.                           System.out.println("scheduler。。等待1s在执行"+number);
  68.                           Thread.sleep(1000);
  69.                          } catch (InterruptedException e) {
  70.                           e.printStackTrace();
  71.                          }
  72.                         }}, 3, TimeUnit.SECONDS);

  73.                   }
  74.        
  75.         }
  76. }
复制代码
回复 使用道具 举报
风祭将o 发表于 2014-12-24 23:11
今天上网看视频自学了线程池,但只是基本的了解,对于其中同步的方法不是很懂。。另外我不知道为什么当在同 ...

很给力:
  1. package gaoxin;

  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;

  4. /*
  5. *
  6. * 第五期
  7. *通过查询JDK自带的线程池,学习线程池的使用方法。
  8. *并做以下练习:通过从线程池中获取的线程执行一个多线程任务(任务自定义)。
  9. *想得满分,至少得写出两种线程池的用法,并附带详细的注释。
  10. **/
  11. //自定义一个线程类,继承了Thread
  12. class MyThread extends Thread {
  13.         int i = 0;

  14.         // 定义其中的run方法,方法是打印某线程在执行
  15.         public void run() {
  16.                 while (i++ < 3)
  17.                         System.out.println(this.getName() + "正在被执行。。。。。");
  18.         }
  19. }

  20. // 定义一个类,主要是为了让线程池执行里面的executeMethod方法。
  21. public class ThreadPool {
  22.         //定义一个执行方法,形参接受一个线程池
  23.         public static void executeMethod(ExecutorService es) {
  24.                 //让该线程池添加10个MyThread线程并执行。
  25.                 for (int x : new int[5]) {
  26.                         es.execute(new MyThread());
  27.                 }
  28.         }
  29. }

  30. //我分别用三个类来测试三个线程池,是因为线程池之间会相互影响。似乎同一个类中只能同时运行一个线程池?
  31. //单线程的线程池SingleThreadExecutor
  32. //这种线程池里只能同时运行一个线程,如果该线程在运行中因为异常结束了,线程池会重新创建一个线程继续执行。
  33. class SingleThread {
  34.         public static void main(String[] args) {
  35.                 //定义一个单线程的线程池
  36.                 ExecutorService singleThread = Executors.newSingleThreadExecutor();
  37.                 //提示这是执行哪个线程池
  38.                 System.out.println("这是执行singleThreadPool的结果:");
  39.                 //让它执行ThreadPool类中定义的执行方法。
  40.                 ThreadPool.executeMethod(singleThread);
  41.                 //执行完就关闭该线程池
  42.                 singleThread.shutdown();
  43.                 //在打印的结果中我们可以看到,它是按顺序执行的,意味着它每次都只能同时运行一个任务。
  44.         }
  45. }
  46. //可重用固定数量的线程池FixedThreadPool
  47. //这种线程池里可同时运行指定数量的线程,每完成了一个任务时就再创建一个线程去执行任务,直到线程数量达到线程池可同时运行的最大值。
  48. class FixedThread {
  49.         public static void main(String[] args) {
  50.                 //同上
  51.                 ExecutorService fixedThread = Executors.newFixedThreadPool(3);
  52.                 System.out.println("这是执行FixedThreadPool的结果:");
  53.                 ThreadPool.executeMethod(fixedThread);
  54.                 fixedThread.shutdown();
  55.                 //在打印的结果中,我们可以看到,
  56.                 //它在执行第一个任务后不断地创建新线程去执行余下的任务,直到线程数量达到了可允许的最大值。
  57.                 //观察结果可发现,它同时执行的线程不超过3个。
  58.         }
  59. }
  60. //可缓存的线程池CachedThreadPool
  61. //它也是在完成一个线程任务后再创建一个线程,但不同于fixedThreadPool的是它没有限制数量,
  62. //它里面所能容纳的最大线程数量理论上是依据计算机内存的大小而定的。
  63. //另外,当线程池大小超过需要运行的线程时,线程池就会回收空闲的线程。而任务增加时又将添加新线程来执行任务。
  64. class CachedThread {
  65.         public static void main(String[] args) {
  66.                 //同上
  67.                 ExecutorService cachedThread = Executors.newCachedThreadPool();
  68.                 System.out.println("这是执行CachedThreadPool的结果:");
  69.                 ThreadPool.executeMethod(cachedThread);
  70.                 cachedThread.shutdown();
  71.                 //在打印 的结果中,我们可以发现可缓存的线程池几乎可以同时运行所有线程。
  72.         }
  73. }
复制代码
回复 使用道具 举报
佛说 发表于 2014-12-29 17:21
马上就要入学考试了,还差很多技术分,来领题

你的技术分已经够了呀
回复 使用道具 举报
陈宁 发表于 2015-3-10 16:24
阳哥,我来领题!

欢迎领题。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马