1. 程式人生 > >對於執行緒池的一些學習

對於執行緒池的一些學習

ThreadPoolExecutor

執行緒池是什麼,作用:執行緒池可以解決兩個不同問題:由於減少了每個任務呼叫的開銷,它們通常可以在執行大量非同步任務時提供增強的效能,並且還可以提供繫結和管理資源(包括執行任務集時使用的執行緒)的方法。每個 ThreadPoolExecutor 還維護著一些基本的統計資料,如完成的任務數。

Thread與Runable的用法


class MyThread extends Thread {

String name;

int ticket=5;

public MyThread(String name) {

    this.name = name;
}

@Override
public void run() {

    for (int i = 0; i < 5; i++) {
        if(ticket>0){
            System.out.println("當前執行緒=" +Thread.currentThread().getName()+ "剩餘票數=" + ticket--);
        }
    }
}

}

class MyRunnable implements Runnable {

int ticket=5;

public void run() {

    for (int i = 0; i < 5; i++) {
        if(ticket>0){
            System.out.println("當前執行緒=" +Thread.currentThread().getName()+ "剩餘票數=" + ticket--);
        }

    }
}

}

public class MMMM {

public static void main(String[] args) {

    Thread thread1=new MyThread("a");

    Thread thread2=new MyThread("b");

    /*MyRunnable r=new MyRunnable();

    Thread thread1=new Thread(r,"a");

    Thread thread2=new Thread(r,"b");*/

    thread1.start();

    thread2.start();
}
/**
 * 總結:呼叫Thread的run方法,只會執行一個執行緒,呼叫start方法可以建立一個執行緒去執行run方法
 * 
 * 資源無法共享,執行緒資源獨立
 * 
 * 拖過Runnable來實現資源共享,new一個Runnable類例項,通過Thread的strat方法執行Runnable的run方法
 * 
 * Thread的start啟動一個執行緒,進入等待佇列,run執行執行緒,
 * 
 * Runnable方法的run不建立執行緒
 * 
 * */
</php>

四大執行緒池

1.可快取執行緒池 執行緒數無限制,有空閒執行緒複用,若無開啟新執行緒,一定程式上減少建立,銷燬執行緒,減少系統開銷
ExecutorService cachedThreadPool= Executors.newCachedThreadPool();
2.定長執行緒池(併發執行緒池) 可控制執行緒最大併發數,超出執行緒會在佇列中等待
ExecutorService fixedThreadPool=Executors.newFixedThreadPool(3);
3.定長執行緒池(週期性執行緒池) 定時週期性執行任務
ExecutorService scheduledThreadPool=Executors.newScheduledThreadPool(6);
4.單執行緒化的執行緒池 單次執行,按照順序
ExecutorService singleThreadExecutor=Executors.newSingleThreadExecutor();

用法


// 快取執行緒池:執行第二個執行緒時,第一個已經執行完畢,則復當前執行緒,節省開銷
for(int i=0;i<10;i++){

        final int index=i;

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        cachedThreadPool.execute(new Runnable() {
            @Override
            public void run() {

                Log.i("mao","當前i="+index);
            }
        });
    }

    //定長執行緒池:同一時間執行最大併發執行緒,其餘執行緒在佇列中等待
    for(int i=0;i<10;i++){

        final int index=i;



        fixedThreadPool.execute(new Runnable() {
            @Override
            public void run() {

                Log.i("mao","當前i="+index);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }


    //定長執行緒池:性延遲2秒後每三秒執行一次執行緒池
    for(int i=0;i<10;i++){

        final int index=i;

        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {

                Log.i("mao","當前i="+index);
            }
        },2,3, TimeUnit.SECONDS);

    }


    //單執行緒化的執行緒池:順序執行,只有一個工作執行緒在實行任務
    for(int i=0;i<10;i++){

        final int index=i;

        singleThreadExecutor.execute(new Runnable() {
            @Override
            public void run() {
                Log.i("mao","當前i="+index);
            }
        });

    }
</php>

看了兩個多小時的執行緒和執行緒池快要吐了,我去,不過收穫還是不小的,如果上面的內容對你有幫助,那就很開心了。有需要的可以留言,謝謝大家了。