jdk 線程池

Executors

public class MyThreadPool {

    public static void main(String[] args) throws InterruptedException {
        ExecutorService service = new ThreadPoolExecutor(5, 10,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(),new MyThreadFactory("mypool-" ));
//        ExecutorService service = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 6; i++) {
            service.execute(() -> {
                try {
                    System.out.println(Thread.currentThread().getName());
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });

        }

        System.out.println(service);

        service.shutdown();

        System.out.println(service.isTerminated());
        System.out.println(service.isShutdown());

        TimeUnit.SECONDS.sleep(5);
        System.out.println(service.isTerminated());
        System.out.println(service.isShutdown());
        System.out.println(service);
    }
}

class MyThreadFactory implements ThreadFactory{

    private String threadName;
    private final AtomicInteger index = new AtomicInteger(1);

    MyThreadFactory(String threadName){
        this.threadName = threadName;
    }

    @Override
    public Thread newThread(Runnable r) {
        return new Thread(r,threadName + index.getAndAdd(1));
    }
}

WorkStealingPool

public class WorkStealingPoolTest {

    /**
     * 線程數
     */
    private static final int threads = 10;

    /**
     * 用于計算線程是否執(zhí)行完畢
     */
    CountDownLatch countDownLatch = new CountDownLatch(10);



    /**
     * newFixedThreadPool execute
     *
     * @throws ExecutionException
     * @throws InterruptedException
     */
    @Test
    public void test1() throws InterruptedException {
        System.out.println("---start---");
        ExecutorService executorService = Executors.newWorkStealingPool();
        for (int i = 0; i < threads; i++) {
            executorService.execute(() -> {

                try {
                    System.out.println(Thread.currentThread().getName());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    countDownLatch.countDown();
                }
            });
            
        }
        countDownLatch.await();
        System.out.println("---end---");
    }

    /**
     * newFixedThreadPool submit Callable
     *
     * @throws ExecutionException
     * @throws InterruptedException
     */
    @Test
    public void test3() throws ExecutionException, InterruptedException {
        System.out.println("--- start ---");
        ExecutorService service = Executors.newWorkStealingPool();
        for (int i = 0; i < threads; i++) {
            FutureTask<?> futureTask = new FutureTask<>(() -> Thread.currentThread().getName());

            service.submit(futureTask);

            System.out.println(futureTask.get());
            
        }
        System.out.println("--- end ---");

        System.out.println(Runtime.getRuntime().availableProcessors());
    }

}

ForkJoinPool

public class ForkJoinTest {

    static int[] nums = new int[1000000];
    static final int MAX_NUM = 50000;
    static Random r = new Random();

    static {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = r.nextInt(100);
        }

        // 第一種
        System.out.println(Arrays.stream(nums).sum());
    }

    static class AddTask extends RecursiveAction {

        int start, end;

        AddTask(int start, int end) {
            this.start = start;
            this.end = end;
        }



        @Override
        protected void compute() {
            if (end - start <= MAX_NUM) {
                long sum = 0L;
                for (int i = start; i < end; i++) {
                    sum += nums[i];
                }
                System.out.println("from:" + start + " to:" + end);
            } else {
                int middle = start + (end-start)/2;

                AddTask subTask1 = new AddTask(start,middle);
                AddTask subTask2 = new AddTask(middle,end);
                subTask1.fork();
                subTask2.fork();
            }
        }
    }

    public static void main(String[] args) {
        new AddTask(0,nums.length).compute();

        try {
            // 因為forkjoin 是守護線程载庭,所以需要用阻塞方法,等待forkjoin完成。
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public class ForkJoinTest2 {



    static int[] nums = new int[1000000];
    static final int MAX_NUM = 50000;
    static Random r = new Random();

    static {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = r.nextInt(100);
        }

        // 第一種
        System.out.println(Arrays.stream(nums).sum());
    }


    static class AddTask extends RecursiveTask<Long> {

        int start, end;

        AddTask(int start, int end) {
            this.start = start;
            this.end = end;
        }

        @Override
        protected Long compute() {

            if (end -start <= MAX_NUM) {
                long sum = 0L;
                for (int i = start; i < end; i++) {
                    sum += nums[i];

                }
                System.out.println("from: " + start + " to:" + end);
                return sum;
            }

            int middle = start + (end - start) / 2;

            AddTask subTask1 = new AddTask(start,middle);
            AddTask subTask2 = new AddTask(middle, end);
            subTask1.fork();
            subTask2.fork();
            return subTask1.join() + subTask2.join();
        }
    }

    public static void main(String[] args) throws IOException {
        ForkJoinPool fjp = new ForkJoinPool();
        AddTask task = new AddTask(0,nums.length);
        fjp.execute(task);

        long result = task.join();
        System.out.println(result);

        System.in.read();
    }
}

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末佛寿,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌郊尝,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粗悯,死亡現場離奇詭異虚循,居然都是意外死亡,警方通過查閱死者的電腦和手機样傍,發(fā)現死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門横缔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衫哥,你說我怎么就攤上這事茎刚。” “怎么了撤逢?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵膛锭,是天一觀的道長。 經常有香客問我蚊荣,道長初狰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任互例,我火速辦了婚禮奢入,結果婚禮上,老公的妹妹穿的比我還像新娘媳叨。我一直安慰自己腥光,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布糊秆。 她就那樣靜靜地躺著武福,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痘番。 梳的紋絲不亂的頭發(fā)上捉片,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音,去河邊找鬼界睁。 笑死觉增,一個胖子當著我的面吹牛兵拢,可吹牛的內容都是我干的翻斟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼说铃,長吁一口氣:“原來是場噩夢啊……” “哼访惜!你這毒婦竟也來了?” 一聲冷哼從身側響起腻扇,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤债热,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后幼苛,有當地人在樹林里發(fā)現了一具尸體窒篱,經...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年舶沿,在試婚紗的時候發(fā)現自己被綠了墙杯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡括荡,死狀恐怖高镐,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情畸冲,我是刑警寧澤嫉髓,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站邑闲,受9級特大地震影響算行,放射性物質發(fā)生泄漏。R本人自食惡果不足惜苫耸,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一州邢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鲸阔,春花似錦偷霉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渔扎,卻和暖如春硫狞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工残吩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留财忽,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓泣侮,卻偏偏與公主長得像即彪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子活尊,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容