一、線程的優先級別
線程優先級別的使用范例:
run()方法一結束,線程也就結束了。
二、線程同步
synchronized關鍵字的使用范例:
線程死鎖的問題:
代碼:
package cn.galc.test;
/*這個小程序模擬的是線程死鎖的問題*/
public class TestDeadLock implements Runnable {
public int flag = 1;
static Object o1 = new Object(), o2 = new Object();
public void run() {
System.out.println(Thread.currentThread().getName() + "的flag=" + flag);
/*
* 運行程序后發現程序執行到這里打印出flag以后就再也不往下執行后面的if語句了
* 程序也就死在了這里,既不往下執行也不退出
*/
/* 這是flag=1這個線程 */
if (flag == 1) {
synchronized (o1) {
/* 使用synchronized關鍵字把對象01鎖定了 */
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
/*
* 前面已經鎖住了對象o1,只要再能鎖住o2,那么就能執行打印出1的操作了
* 可是這里無法鎖定對象o2,因為在另外一個flag=0這個線程里面已經把對象o1給鎖住了
* 盡管鎖住o2這個對象的線程會每隔500毫秒睡眠一次,可是在睡眠的時候仍然是鎖住o2不放的
*/
System.out.println("1");
}
}
}
/*
* 這里的兩個if語句都將無法執行,因為已經造成了線程死鎖的問題
* flag=1這個線程在等待flag=0這個線程把對象o2的鎖解開,
* 而flag=0這個線程也在等待flag=1這個線程把對象o1的鎖解開
* 然而這兩個線程都不愿意解開鎖住的對象,所以就造成了線程死鎖的問題
*/
/* 這是flag=0這個線程 */
if (flag == 0) {
synchronized (o2) {
/* 這里先使用synchronized鎖住對象o2 */
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
/*
* 前面已經鎖住了對象o2,只要再能鎖住o1,那么就能執行打印出0的操作了 可是這里無法鎖定對象o1,因為在另外一個flag=1這個線程里面已經把對象o1給鎖住了 盡管鎖住o1這個對象的線程會每隔500毫秒睡眠一次,可是在睡眠的時候仍然是鎖住o1不放的
*/
System.out.println("0");
}
}
}
}
public static void main(String args[]) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.setName("線程td1");
t2.setName("線程td2");
t1.start();
t2.start();
}
}
解決線程死鎖的問題最好只鎖定一個對象,不要同時鎖定兩個對象
生產者消費者問題: