這些執行緒你可能不知道哦
java中的多執行緒
-
程式
-
檔案
-
-
程序
-
執行緒
-
cpu排程的最小單位
-
一個程序中至少有一個執行緒,如果只有一個執行緒,則這個執行緒就是主執行緒(main執行緒)
-
Java中執行緒的建立
-
繼承自Thread類
-
實現Runnable介面
執行緒安全性問題:
產生的原因
多個執行緒物件同時訪問同一個全域性變數
如何解決:
加鎖(同步鎖)
加鎖方式:
-
同步程式碼塊
-
synchronized
-
-
同步方法
-
宣告方法時新增synchronized
-
-
加鎖的物件
-
保證鎖物件的唯一
-
執行緒池的介紹
-
池化技術
-
c3p0 dbcp ...
-
執行緒池
-
-
執行緒池的衍生
-
頻繁的建立執行緒物件和多個執行緒之間進行上下文切換,是非常耗費時間和資源的,所以jdk1.5中提出了執行緒池技術
-
-
使用執行緒池
Executor
執行緒池的建立
建立固定大小容量的執行緒池(**)
ExecutorService pool = Executors.newFixedThreadPool(2);
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);//執行緒池的帶下只有兩個 現在這個任務在其等待佇列中排隊等候
**建立可變大小的執行緒池
ExecutorService pool = Executors.newCachedThreadPool();
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);
**建立獨立任務的執行緒
ExecutorService pool = Executors.newSingleThreadExecutor();
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);
**建立可排程的執行緒
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(2);
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
threadPool.schedule(task, 2000, TimeUnit.MILLISECONDS);