JavaEE程序员JavaEE 学习专题

Java_多线程(线程池 )

2017-09-23  本文已影响39人  Miss_差不多

线程池

我们在项目中往往会创建线程以方便使用,但如果在并发的线程数量多,并每个线程都执行一个时间很短的任务就结束时,就会频繁的创建线程,这样会降低系统的效率拖慢运行时间.在java中我们有更好的办法来实现这样的效果,就是线程池.

利用线程池的好处:

java通过EXecutors提供了四种线程池

newCachedThreadPool

java代码

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;


public class Test1 {
   public static void main(String[] args) throws InterruptedException {
      Executor ex = Executors.newCachedThreadPool();
      
      for (int i = 0; i < 10; i++) {
          final int index = i;
        Thread.sleep(index * 1000);
         new Thread(new Runnable() {
                
                @Override
                public void run() {
                    System.out.println("线程1");
                    
                }
            }).start();
             new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                        System.out.println("线程2");
                        
                    }
                }).start();
             ex.execute(new Runnable() {
                
                @Override
                public void run() {
                
                 synchronized (this) {
                     System.out.println("线程三");
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    notifyAll();
                }
                    
                }
            });
    }
    }
}

线程1
线程2
线程三
线程1
线程2
线程三

newFixedThreadPool
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

//线程池  防止频繁的创建线程  减少
public class Test3 {
    public static void main(String[] args) {
             //创建线程池
        Executor ec = Executors.newFixedThreadPool(3);//int  线程池中保留的个数
        ec.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程1");
                
            }
        });
        ec.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程2");
                
            }
        });
        
        }
}

newScheduledThreadPool
    package test;  
    import java.util.concurrent.Executors;  
    import java.util.concurrent.ScheduledExecutorService;  
    import java.util.concurrent.TimeUnit;  
    public class ThreadPoolExecutorTest {  
     public static void main(String[] args) {  
      ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);  
      scheduledThreadPool.schedule(new Runnable() {  
       public void run() {  
        System.out.println("delay 3 seconds");  
       }  
      }, 3, TimeUnit.SECONDS);  
     }  
    }  

结果延迟3秒执行.

newSingleThreadExecutor
    package test;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    public class ThreadPoolExecutorTest {  
     public static void main(String[] args) {  
      ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();  
      for (int i = 0; i < 10; i++) {  
       final int index = i;  
       singleThreadExecutor.execute(new Runnable() {  
        public void run() {  
         try {  
          System.out.println(index);  
          Thread.sleep(2000);  
         } catch (InterruptedException e) {  
          e.printStackTrace();  
         }  
        }  
       });  
      }  
     }  
    }  

结果一次输出,相当于顺序执行.

上一篇下一篇

猜你喜欢

热点阅读