併發編程實現的基本方式、線程池創建及執行任務、線程優先級、後臺線程

1,Thread.yield()方法可以提醒線程調度器去執行別的線程;

2,ExecutorService exec = Executors.newCachedThreadPool();

exec.execute(實現runable接口的類);

exec.shutdown();代表當前線程池在shutdown方法調用後將拒絕添加新的任務,但之前添加的任務仍然照常執行。

2,ExecutorService exec = Executors.newFixedThreadPool(5);

創建一個有邊界的線程池,省去了上面線程池創建線程的時間,這個線程池會初始化時就創建所有線程。

3,ExecutorService exec = Executors.newSingleThreadExecutor();

創建一個單線程的線程池,本質即一個線程的FixedThreadPool,加入到該線程池中的任務會排隊執行。

4,class TaskWithResult implements Callable{}

List<Future<String>> results = new ArrayList();

results.add(exec.submit(new TaskWithResult()));

ExecutorService執行submit方法返回Future,Future可以執行isDone方法判斷該線程是否結束,調用get方法會阻塞,一直等到該線程返回值。

5,TimeUnit.MILLISECONDS.sleep(100);這個方法代替之前Thread.sleep();

6,通過修改線程優先級:Thread.currentThread().setPriority()可以設置優先級,優先級高的理論上會被多執行。

7,後臺線程的概念:線程默認是非後臺的,因爲後臺線程並不能阻止程序退出,即在main方法中開啓多個後臺線程,main方法結束後,多個後臺線程不管是否執行完,都結束。後臺線程可以通過setDaemon(true)設置。

8,synchronized:非靜態方法是鎖當前對象,靜態方法是鎖類,給代碼塊加鎖:鎖定某個對象。

Lock lock = new ReenTrantLock();lock.lock;在finally中添加代碼lock.unlock();

9,volatile保證變量可見性,有序性。但並不能保證線程安全。可能存在還剩4張票,多個線程執行i—後可能,還剩3張票。

10,原子類:這種類保證了,不用加鎖,就可以保證線程安全。

11,synchronized關鍵字加到非靜態方法上,一個對象被多個線程調用,這個對象的多個加鎖的方法是互斥的。

多個對象被多個線程調用,加鎖的方法是互不影響的。

synchronized關鍵字加到靜態方法上,多個線程中用類調用加鎖靜態方法,互斥的。

這個類的某個對象在多個線程中,調用加鎖的靜態或非靜態方法,互斥的。

多個線程中使用一個對象,有的調用加鎖靜態方法、有的調用加鎖非靜態方法,不會互斥。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章