1. 程式人生 > >(執行緒四)執行緒池

(執行緒四)執行緒池

執行緒池:顧名思義,充滿執行緒的池子,通過呼叫Executors類方法來實現建立執行緒池以及進行任務的任務。

例一:通過Executors類靜態方法ExecutorService newFixedThreadPool(int nThread)(混合執行緒)來建立執行緒池。再呼叫execute方法將任務新增至執行緒池後便可以執行。

                        import java.util.concurrent.ExecutorService;
                        import java.util.concurrent.Executors;
                        public class ThreadpoolDemo1 {
                            public static void main(String[] args) {
                                ExecutorService pool=Executors.newFixedThreadPool(2);
                                Run r1=new Run("r1");
                                Run r2=new Run("r2");
                                Run r3=new Run("r3");
                                Run r4=new Run("r4");
                                pool.execute(r1);
                                pool.execute(r2);
                                pool.execute(r3);
                                pool.execute(r4);
                            }
                        }
                        class Run implements Runnable{
                            private String name;
                            public Run(String name) {
                                this.name=name;
                            }
                            public void run() {
                                for(int i=0;i<3;i++) {
                                    System.out.println(name+":"+i);
                                    try {
                                        Thread.sleep(500);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }
                        執行結果:
                        r1:0
                        r2:0
                        r1:1
                        r2:1
                        r2:2
                        r1:2
                        r3:0
                        r4:0
                        r3:1
                        r4:1
                        r4:2
                        r3:2

                        有結果可知,該方法開始任務的順序為新增任務順序,nThread引數為可同時開始的執行緒數,但是任務結束後為什麼程式仍在執行?因為我們指定的可開始的執行緒有兩個,但是其中執行緒池中一共有多少個執行緒我們並不知道,所以可能還會有其他執行緒在進行,所以程式並沒有結束

例二:通過Executors類靜態方法ExecutorService newSingleThreadExecutor()(單個執行緒)來建立執行緒池。再呼叫execute方法將任務新增至執行緒池後便可以執行。

                        import java.util.concurrent.ExecutorService;
                        import java.util.concurrent.Executors;
                        public class ThreadpoolDemo2 {
                            public static void main(String[] args) {
                                ExecutorService pool= Executors.newSingleThreadExecutor();
                                Run r1=new Run("A");
                                Run r2=new Run("B");
                                Run r3=new Run("C");
                                pool.execute(r1);
                                pool.execute(r2);
                                pool.execute(r3);
                            }
                        }
                        class Run implements Runnable{
                            private String name;
                            public Run(String name) {
                                this.name=name;
                            }
                            public void run() {
                                for(int i=0;i<3;i++) {
                                    System.out.println(name+":"+i);
                                    try {
                                        Thread.sleep(500);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }
                        執行結果:
                        A:0
                        A:1
                        A:2
                        B:0
                        B:1
                        B:2
                        C:0
                        C:1
                        C:2

例三:通過Executors類靜態方法ExecutorService newCachedThreadPool()(快取執行緒)來建立執行緒池。再呼叫execute方法將任務新增至執行緒池後便可以執行。

                        import java.util.concurrent.ExecutorService;
                        import java.util.concurrent.Executors;
                        public class ThreadpoolDemo3 {
                            public static void main(String[] args) {
                                ExecutorService pool=Executors.newCachedThreadPool();
                                Run r1=new Run("r1");
                                Run r2=new Run("r2");
                                pool.execute(r1);
                                pool.execute(r2);
                                try {
                                    Thread.sleep(5000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                Run r3=new Run("r3");
                                Run r4=new Run("r4");
                                Run r5=new Run("r5");
                                pool.execute(r3);
                                pool.execute(r4);
                                pool.execute(r5);
                            }
                        }
                        class Run implements Runnable{
                            private String name;
                            public Run(String name) {
                                this.name=name;
                            }
                            public void run() {
                                for(int i=0;i<3;i++) {
                                    System.out.println(name+":"+i);
                                    try {
                                        Thread.sleep(500);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }
                        執行結果:
                        r2:0
                        r1:0
                        r1:1
                        r2:1
                        r2:2
                        r1:2
                        r4:0
                        r3:0
                        r5:0
                        r3:1
                        r4:1
                        r5:1
                        r3:2
                        r4:2
                        r5:2

                        可見在該方法中會根據先開始幾個任務來確定給幾個執行緒,給定執行緒後再執行接下來的任務,當開始的任務執行結束後,執行緒會處於空閒狀態,當再次執行接下來的任務時,會同時開始確定數的任務,直至執行結束

例四:通過Executors類靜態方法ScheduledExecutorService newScheduledThreadPool(int corePoolSize)(定時執行)來建立執行緒池。再呼叫execute方法將任務新增至執行緒池後便可以執行,該類還有一個方法為scheduled(Runnable command,long delay,TimeUnit unit),引數內容為什麼任務,多長時間後執行,什麼單位。

                        import java.util.concurrent.Executors;
                        import java.util.concurrent.ScheduledExecutorService;
                        import java.util.concurrent.TimeUnit;
                        public class ThreadpoolDemo4 {
                            public static void main(String[] args) {
                                ScheduledExecutorService pool=Executors.newScheduledThreadPool(2);
                                Run r1=new Run("A");
                                Run r2=new Run("B");
                                Run r3=new Run("C");
                                Run r4=new Run("D");
                                pool.schedule(r1,3,TimeUnit.SECONDS);
                                pool.execute(r2);
                                pool.execute(r3);
                                pool.schedule(r4,6,TimeUnit.SECONDS);
                            }
                        }
                        class Run implements Runnable{
                            private String name;
                            public Run(String name) {
                                this.name=name;
                            }
                            public void run() {
                                for(int i=0;i<3;i++) {
                                    System.out.println(name+":"+i);
                                    try {
                                        Thread.sleep(500);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }
                        執行結果:
                        B:0
                        C:0
                        B:1
                        C:1
                        B:2
                        C:2
                        A:0
                        A:1
                        A:2
                        D:0
                        D:1
                        D:2