建立線程的4種方式

方式一:繼承Thread類重寫run方法

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("啓動自定義線程");
        super.run();
    }
}

//啓動線程
new MyThread().start();

方式二:實現Runnable接口

lambda表達式java

new Thread(()->{
    System.out.println("runnable接口啓動");
},"runnable-Thread").start();

方式三:使用FutureTask和Callable接口

FutureTask<String> futureTask=new FutureTask<>(()->{
    return "callable方式啓動線程";
});
new Thread(futureTask).start();
try {
    String s = futureTask.get();//線程阻塞獲取返回值
    System.out.println(s);
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
}

方式四:使用線程池建立

建立線程池的方式一:使用Executors建立線程池

//1.建立10個線程的線程池
ExecutorService executorService = Executors.newFixedThreadPool(10);
//2.建立緩存的線程池,這種方式能夠控制內存不會被佔滿。
ExecutorService executorService2 = Executors.newCachedThreadPool();
//3.建立擁有定時任務的固定線程個數的線程池,能夠定時執行
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
//4.建立單線程
ExecutorService executorService = Executors.newSingleThreadExecutor();

建立線程池的方式二:使用ThreadPoolExecutor建立自定義的線程池

new ThreadPoolExecutor(		  int corePoolSize,  //核心線程個數
                              int maximumPoolSize,//最大的線程個數
                              long keepAliveTime,//超過核心線程個數的空閒線程,空閒線程的的存活時間,超過就會被銷燬
                              TimeUnit unit,//時間單位
                              BlockingQueue<Runnable> workQueue) //線程隊列,超過maximumPoolSize值能存下的線程隊列個數
                              ThreadFactory threadFactory,//建立線程的線程工廠
                              RejectedExecutionHandler handler //超過線程池個數的線程的拒絕策略
//1.公平的線程隊列,若是不傳第二參數則默認是false
ArrayBlockingQueue<Runnable> workQueue1 = new ArrayBlockingQueue<>(10, true);
//2.默認阻塞隊列個數,空參構造方法會獲得一個默認的線程隊列值爲Integer.MAX_VALUE 2的31次方
LinkedBlockingDeque<Runnable> workQueue2 = new LinkedBlockingDeque<>(10);

/** *建立自定義的線程池示例 */
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
6, //核心線程6個
20, //最大線程20個
20, //空閒時間20秒(由下面的參數設置),非核心線程的空閒時間超過則銷燬
TimeUnit.SECONDS,//時間可是秒,若是要其它單位則換成對應的便可
workQueue2,   //使用的是LinkedBlockingDeque,也能夠使用ArrayBlockingQueue
Executors.defaultThreadFactory(),//默認的線程工廠建立新線程
new ThreadPoolExecutor.AbortPolicy()//直接拒絕新任務
);

在這裏插入圖片描述
分表表明緩存

  1. 直接丟棄新來的任務
  2. 因爲沒有空閒線程,而且阻塞隊列也滿了,可是又執行線程call方法l至關於同步調用,不會開一個線程
  3. 丟棄最老的線程,不會拋異常
  4. 直接丟棄新來的任務,不會拋異常
爲何須要有線程池?使用線程池的目的是什麼?

解答:
若是使用new Thread方式啓動線程,那麼線程將不受控制,
若是是在where (true)裏執行new Thread則會致使一直建立線程,這樣很快就會耗盡計算機資源,容易形成死機。ide

相關文章
相關標籤/搜索