JAVA執行緒(補充)
阿新 • • 發佈:2019-01-12
執行緒優先順序
package com.thread.priority;
/**
* 執行緒優先順序:每個執行緒都有一個優先順序,高優先順序的執行緒執行優先於低優先順序執行緒
* 預設優先順序:5
* 範圍:1-10
* 這個只有在次數特別多的情況下,效果才可能比較明顯
*
* public final int getPriority() 返回執行緒的優先順序。
* public final void setPriority(int newPriority)更改執行緒的優先順序。
*/
public class PriorityDemo {
public static void main(String[] args) {
Priority p = new Priority();
Thread p1 = new Thread(p, "a");
Thread p2 = new Thread(p, "b");
Thread p3 = new Thread(p, "c");
p1.setPriority(10);
p3.setPriority(1);
p1.start();
p2.start();
p3.start();
}
}
package com.thread.priority;
public class Priority implements Runnable {
private int x = 30;
@Override
public void run() {
while (x > 0) {
System.out.println(Thread.currentThread().getName() + "***" + x);
x--;
}
}
}
守護執行緒以及等待執行緒
守護執行緒
package com.thread.priority;
/**
* 假設main執行緒代表劉備
* public final void setDaemon(boolean on)
* 將該執行緒標記為守護執行緒或使用者執行緒。當正在執行的執行緒都是守護執行緒時,Java 虛擬機器退出。
* 如果在執行的執行緒都是守護執行緒,那麼程式就會退出
* 舉例:坦克大戰
*
*/
public class JoinDemo {
public static void main(String[] args) {
Join j = new Join();
Thread t1 = new Thread(j, "關羽");
Thread t2 = new Thread(j, "張飛");
/**
* 將這兩個執行緒設定為守護執行緒,守護主執行緒、
* 當主執行緒main停止了的時候,兩個守護執行緒也會停止
*/
t1.setDaemon(true);
t2.setDaemon(true);
t1.start();
t2.start();
for (int x = 0; x < 5; x++) {
System.out.println(Thread.currentThread().getName() + "---" + x);
}
}
}
package com.thread.priority;
public class Join implements Runnable {
private int x = 30;
@Override
public void run() {
while (x > 0) {
System.out.println(Thread.currentThread().getName() + "***" + x);
x--;
}
}
}
等待執行緒
package com.thread.priority;
/**
*
* public final void join(long millis)
* throws InterruptedException等待該執行緒終止的時間最長為 millis 毫秒。
* 超時為 0 意味著要一直等下去。
* 讓其他的執行緒一直等著。
*
*/
public class JoinDemo {
public static void main(String[] args) throws InterruptedException {
Join j = new Join();
Thread t1 = new Thread(j, "關羽");
Thread t2 = new Thread(j, "張飛");
Thread t3 = new Thread(j, "諸葛亮");
/**
* 此處注意順序,join在哪些執行緒前面,哪些執行緒就得等待join執行緒結束才可以啟動
*/
t3.start();
t3.join();
t1.start();
t2.start();
}
}
package com.thread.priority;
public class Join implements Runnable {
@Override
public void run() {
for (int x = 0; x < 10; x++) {
System.out.println(Thread.currentThread().getName() + "***" + x);
}
}
}
暫停執行緒
package com.thread.priority;
/**
* public static void yield()暫停當前正在執行的執行緒物件,並執行其他執行緒。
* 為了讓執行緒間的執行更和諧一些
* 但是。你想要看到資料的依次出現,還是依賴等待喚醒機制。
*
*/
public class YieldDemo {
public static void main(String[] args) {
Yield y = new Yield();
Thread y1 = new Thread(y);
Thread y2 = new Thread(y);
y1.start();
y2.start();
}
}
package com.thread.priority;
public class Yield implements Runnable {
private int x = 30;
@Override
public void run() {
while (x > 0) {
System.out.println(Thread.currentThread().getName() + "***" + x);
Thread.yield();
x--;
}
}
}
sleep()和wait()方法的區別:
sleep
sleep()是Thread類中的方法,
sleep必須指定引數,
sleep不釋放鎖物件,
wait()
wait()是Object中的方法
wait可以不用指定時間,可以指定時間
釋放所物件
多生產多消費模式
將方法notify()改為notifyAll()
匿名Thread
package com.thread.priority;
public class TestDemo {
public static void main(String[] args) {
new Thread() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.print(i + " ");
}
System.out.println();
}
}.start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 5; i < 10; i++) {
System.out.print(i + " ");
}
System.out.println();
}
}) {
}.start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 10; i < 20; i++) {
System.out.print(i + "");
}
}
}) {
/**
* 為什麼會列印此處的?
* 通過檢視原始碼可以知道:
* Thread的run方法的功能是,先判斷target是否為null,
* 如果不為null就呼叫target的run()方法
* 可是我們這裡已經重寫了run方法,所以,不會執行原始碼Thread中的run方法,進而不會執行Runnable中 的run方法
* @see java.lang.Thread#run()
*/
@Override
public void run() {
for (int i = 20; i < 30; i++) {
//列印的是此處的
System.out.print(i + " ");
}
}
}.start();
}
}
java與模式 書籍。
大話設計模式
易學設計模式