[7]スレッドとスレッドプール

1.スレッドのライフサイクル:

 

* start()は新しいスレッドを開始し、1回だけ呼び出すことができます。run()メソッドは新しいスレッドを開始せず、単にメソッドを呼び出します。

* currentThread()は、現在のスレッドを取得します

* getName()は、スレッドの名前を取得します

* setName()はスレッドの名前を設定します

* Yield()このメソッドを呼び出すスレッドは、現在のCPU実行権を解放します。注:ただし、現在のスレッドはCPUリソースをプリエンプトする可能性があります

* join()は、スレッドAのスレッドBのjoin()メソッドを呼び出します。つまり、このメソッドが実行されると、スレッドAはスレッドBの実行が完了するまで実行を停止し、スレッドAはjoin()の後にコードを実行します。

* isAlive()は、スレッドがまだ生きているかどうかを判別します

* sleep(long l)は、メソッドを呼び出すスレッドを1ミリ秒スリープさせます。このとき、他のスレッドはCPUリソースを使用でき、このメソッドを呼び出すスレッドはCPUリソースを使用できませんが、スレッドはロックを保持します。

* setPriority(int newPriority)は、スレッドの優先度を設定します。最小値は1、最大値は10、デフォルトは5です。優先度が高いほど、CPUリソースを取得する可能性が高くなり、必ずしも優先度が高くなるとは限りません。最初のスレッドを実行しました

注意:

sleep()メソッドはロックを解放せず、wait()メソッドはロックを解放します

2、スレッドプール

/*

* 一、线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。

*

* 二、线程池的体系结构:

*  java.util.concurrent.Executor : 负责线程的使用与调度的根接口

*      |--**ExecutorService 子接口: 线程池的主要接口

*          |--ThreadPoolExecutor 线程池的实现类(继承AbstractExecutorService,AbstractExecutorService实现ExecutorService接口)

*          |--ScheduledExecutorService 子接口:负责线程的调度

*              |--ScheduledThreadPoolExecutor  :继承 ThreadPoolExecutor, 实现  ScheduledExecutorService

*

* 三、工具类 : Executors

* ExecutorService newFixedThreadPool() : 创建固定大小的线程池

* ExecutorService newCachedThreadPool() : 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量。

* ExecutorService newSingleThreadExecutor() :  创建单个线程池。线程池中只有一个线程

*

* ScheduledExecutorService  newScheduledThreadPool() : 创建固定大小的线程,可以延迟或定时的执行任务。

*/

public class TestThreadPool {

    public static void main(String[] args)  throws InterruptedException, ExecutionException  {

        //创建线程池

        ExecutorService pool =  Executors.newFixedThreadPool(5);

        List<Future<Integer>> futures = new  ArrayList<>();

        for(int i=1;i<=10;i++){

            Future<Integer> future =  pool.submit(new Callable<Integer>() {

                int sum=0;

                @Override

                public Integer call() throws  Exception {

                    for(int i=0;i<=100;i++){

                        sum+=i;

                    }

                    return sum;

                }

                

            });

            futures.add(future);

        }

        for(Future future:futures){

            System.out.println(future.get());

        }

        /*//Runnable的形式

        ThreadPoolDemo demo = new  ThreadPoolDemo();

        //添加任务

        for(int i=1;i<=10;i++){

            pool.submit(demo);

        }*/

        //关闭线程池

        pool.shutdown();

    }

}

class ThreadPoolDemo implements Runnable{

    @Override

    public void run() {

        for(int i=0;i<=10;i++){

            System.out.println(Thread.currentThread().getName()+":"+i);

        }

    }

    

}

ScheduledThreadPool:

package com.pj.test.juc2;



import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.ScheduledFuture;

import java.util.concurrent.TimeUnit;



public class TestScheduledThreadPool {



    public static void main(String[] args) throws InterruptedException, ExecutionException {

        ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);

        for(int i=0;i<5;i++){

            ScheduledFuture<Integer> schedule = pool.schedule(new Callable<Integer>() {

                int rand = (int) (Math.random()*100);

                @Override

                public Integer call() throws Exception {

                    System.out.println(rand);

                    return rand;

                }

                

            },3000,TimeUnit.MILLISECONDS);

            System.out.println(schedule.get());

        }

        pool.shutdown();

    }



}

Javaスレッドプールの7つのパラメーター:

public class ThreadPoolExecutor extends AbstractExecutorService {

.....

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,

BlockingQueue<Runnable> workQueue);

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,

BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,

BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler);

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,

BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);

...

}

最初の3つの構築メソッドは、実際には4番目の構築メソッドを呼び出してスレッドプールを初期化します。

corePoolSize:コアスレッドの数、つまり、作成されたばかりのスレッドプール内のスレッドの数

maximumPoolSize:スレッドプール内のスレッドの最大数

keepAliveTime:スレッドが長期間使用されないようにするためのアイドルスレッド保持時間(遅延)。スレッドがこの時間より長く使用されない場合、スレッドは破棄されます。

単位:アイドルスレッド時間の予約単位

workQueue(BlockingQueue <Runnable>タイプ):キューをブロックし、実行を待機しているタスクを格納します。パラメーターは、オプションのArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueueです。

threadFactory(ThreadFactoryタイプ):スレッドファクトリを指定します

ハンドラー(RejectedExecutionHandlerタイプ):拒否されたタスクに対するスレッドプールの処理戦略。

処理戦略は次のとおりです。

ThreadPoolExecutor.AbortPolicy:デフォルトのポリシーで、タスクを破棄し、RejectedExecutionExceptionをスローします。

ThreadPoolExecutor.DiscardPolicy:タスクも破棄しますが、例外はスローしません。

ThreadPoolExecutor.DiscardOldestPolicy:キューの最初のタスクを破棄し、タスクの追加を再試行します。失敗した場合は、プロセスを繰り返します。

ThreadPoolExecutor.CallerRunsPolicy:タスクは呼び出し元のスレッドによって処理されます

おすすめ

転載: blog.csdn.net/Jack_PJ/article/details/88015022