executors是乙個執行緒池工具類
包含以下幾個靜態方法
a.newsinglethreadexecutor
單個執行緒的執行緒池。
b.newcachedthreadpool
這是乙個可快取的執行緒池,如果沒有執行緒池中沒有執行緒則自動建立。
c.newfixedthreadpool
固定長度的執行緒池。
d.newworkstealingpool
使用synchronousqueue阻塞佇列的執行緒池。
這裡只介紹單槽交換,此類主要使用者兩個執行緒用來交換物件,例如:乙個工廠執行緒負責生產物件(生產比較耗費資源),乙個執行緒負責消費,將生產的物件傳給此執行緒消費。只能用來兩個執行緒交換,不能指定執行緒。
public class gradletest catch (interruptedexception e)
};static final runnable run2 = ()-> catch (interruptedexception e)
countdownlatch.countdown();
};static final runnable run3 = ()-> catch (interruptedexception e)
countdownlatch.countdown();
};static final runnable run4 = ()-> catch (interruptedexception e)
countdownlatch.countdown();
};@test
public void testexchanger() catch (interruptedexception e)
}
semaphore經常用於限制獲取某種資源的執行緒數量。
下面**我們看到,同時有5個執行緒申請兩個工具,所以我們必須限制執行緒申請。當2個執行緒已經申請到工具
semaphore.acquire()
其他執行緒處於等待狀態,等待使用工具的執行緒釋放工具
semaphore.release(1)
public class semaphoretest ;
static executorservice executorservice = executors.newcachedthreadpool();
static final countdownlatch countdownlatch = new countdownlatch(5);
static final runnable fix1 = () -> catch (interruptedexception e) finally
};static tools getunusedtools()
}return null;
}static void realsetools(tools tools)
@test
public void testsemaphore() catch (interruptedexception e) }}
cyclicbarrier為執行緒設立屏障,當所有執行緒到達屏障時才繼續往下執行操作。
public class cyclicbarriertest ;
在jdk5.0以前reentrantlock的效能優於synchronized,但是在jdk6.0以後的版本兩者的效能相差無幾。reentrantlock提供了比synchronized能加靈活的操作方式。
public class reentrantlocktest catch (interruptedexception e) finally
};@test
public void testreentrantlock() catch (interruptedexception e) }}
condition是在jdk5.0之後才出現,他是用來替代傳統的synchronized加object的wait()和notify()方法的。
public class conditiontest
if (hadproductnum == maxnum)
int product = factory.incrementandget();
container.addlast(product);
system.out.println(thread.currentthread().getname() + " 生成 " + product);
hadproductnum++;
empty.signal();
} catch (interruptedexception e) finally }}
}static class consumer implements runnable
//容器沒有資料則休息一會
if (container.isempty())
integer product = container.removefirst();
system.out.println(thread.currentthread().getname() + " 消費" + product);
hadconsumenum++;
full.signal();
} catch (interruptedexception e) finally }}
}@test
public void testcondition()catch(exception e)
system.out.println(" 完成. ");}}
reentrantreadwritelock是da有reentrantlock語義的讀寫鎖
(a).重入方面其內部的writelock可以獲取readlock,但是反過來readlock想要獲得writelock則永遠都不要想。
(b).writelock可以降級為readlock,順序是:先獲得writelock再獲得readlock,然後釋放writelock,這時候執行緒將保持readlock的持有。反過來readlock想要公升級為writelock則不可能,為什麼?參看(a),呵呵.
(c).readlock可以被多個執行緒持有並且在作用時排斥任何的writelock,而writelock則是完全的互斥。這一特性最為重要,因為對於高讀取頻率而相對較低寫入的資料結構,使用此類鎖同步機制則可以提高併發量。
(d).不管是readlock還是writelock都支援interrupt,語義與reentrantlock一致。
(e).writelock支援condition並且與reentrantlock語義一致,而readlock則不能使用condition,否則丟擲unsupportedoperationexception異常。
locksupport提供park()和unpark()方法實現阻塞執行緒和解除執行緒阻塞,實現的阻塞和解除阻塞是基於」許可(permit)」作為關聯,permit相當於乙個訊號量(0,1),預設是0. 執行緒之間不再需要乙個object或者其它變數來儲存狀態,不再需要關心對方的狀態.
Spark系列 四 整體架構分析
架構流程圖 說明 driver端流程說明 standalone模式 通過反射的方式建立和構造乙個driveractor程序 driver程序 sparkcontext初始化,構造dagscheduler和taskscheduler.每執行到乙個action操作就會建立乙個job,該job會提交到da...
ODI 系列學習 整體架構概念
odi整體架構沒有oracle database複雜,因為它屬於程式功能的使用,更多是程式開發和配置的工作,當然odi的優化涉及到很多資料庫優化的工作,從整體架構入手,基礎有了,整體把握就會簡單很多。首先理解odi元件的幾個組成部分 odi資料庫,最後看元件與資料庫的關係。odi是乙個資料整合的平台...
ODI 系列學習 整體架構概念
odi整體架構沒有oracle database複雜,因為它屬於程式功能的使用,更多是程式開發和配置的工作,當然odi的優化涉及到很多資料庫優化的工作,從整體架構入手,基礎有了,整體把握就會簡單很多。首先理解odi元件的幾個組成部分 odi資料庫,最後看元件與資料庫的關係。odi是乙個資料整合的平台...