執行緒的等待與喚醒
執行緒的join
需要在幾個執行緒執行完畢之後再執行,例如載入資源等,join方法可以讓執行緒順序執行
例如
public class Example_1 {
public static void main(String[] args) throws InterruptedException {
Thread threadOne = new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("執行緒1啟動");
},"thread-1");
Thread threadTwo = new Thread(() -> System.out.println("執行緒2啟動"),"thread -2 ");
threadOne.start();
threadTwo.start();
threadOne.join();
threadTwo.join();
System.out.println("所有子執行緒執行完畢");
}
}
join是thread類自帶的方法,後續更好的CountDownLatch來使用
yeild方法
yeild方法是執行緒讓出當前cpu的執行權,當前執行緒會由執行狀態轉換為就緒狀態,cpu會從就緒的執行緒中選擇一個執行緒繼續執行,程式碼示例:
public class YieldTest implements Runnable{
public YieldTest() {
Thread thread = new Thread(this);
thread.start();
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
if (i % 5 == 0) {
System.out.println(Thread.currentThread() + " yield cup");
}
Thread.yield();
}
System.out.println(Thread.currentThread() + " is over");
}
}
執行緒的中斷
執行緒死鎖
產生的原因
如何破壞死鎖
守護執行緒和使用者執行緒
java中的執行緒主要分為守護執行緒和使用者執行緒,當啟動一個main函式之後就啟動了一個使用者執行緒,JVM內部也存在很多守護執行緒,例如GC回收執行緒,他們的區別就是當最後一個非守護執行緒退出之後,JVM會正常退出,不管守護執行緒是否退出
建立守護執行緒
public class DaemonThread {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
for (;;) {
}
});
//設定該執行緒為守護執行緒
thread.setDaemon(true);
thread.start();
}
}
ThreadLocal
ThreadLocal主要作用是建立執行緒本地變數,是變數在每個執行緒本地的一個副本
public class ThreadLocalTest {
private static ThreadLocal<String> localVariable = new ThreadLocal<>();
public static void main(String[] args) {
new Thread(() -> {
localVariable.set("thread one local variable ");
print("threadOne");
System.out.println("threadOne remove after" + ":" + localVariable.get());
}).start();
new Thread(() -> {
localVariable.set("thread two local variable");
print("threadTwo");
System.out.println("threadTwo remove after" + ":" + localVariable.get());
}).start();
}
private static void print(String str) {
System.out.println(str + ":"+ localVariable.get());
//清除當前執行緒的本地記憶體中的值
localVariable.remove();
}
}