Java 多線程實例詳解(二)。本站提示廣大學習愛好者:(Java 多線程實例詳解(二))文章只能為提供參考,不一定能成為您想要的結果。以下是Java 多線程實例詳解(二)正文
本文承接上一篇文章《Java多線程實例詳解(一)》。
四.Java多線程的壅塞狀況與線程掌握
上文曾經提到Java壅塞的幾種詳細類型。上面分離看下惹起Java線程壅塞的重要辦法。
1.join()
join —— 讓一個線程期待另外一個線程完成才持續履行。如A線程線程履行體中挪用B線程的join()辦法,則A線程被壅塞,曉得B線程履行完為止,A能力得以持續履行。
public class ThreadTest {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 30) {
thread.start();
try {
thread.join(); // main線程須要期待thread線程履行完後能力持續履行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
2.sleep()
sleep —— 讓以後的正在履行的線程暫停指定的時光,並進入壅塞狀況。在其睡眠的時光段內,該線程因為不是處於停當狀況,是以不會獲得履行的機遇。即便此時體系中沒有任何其他可履行的線程,出於sleep()中的線程也不會履行。是以sleep()辦法經常使用來暫停線程履行。
後面有講到,當挪用了新建的線程的start()辦法後,線程進入到停當狀況,能夠會在接上去的某個時光獲得CPU時光片得以履行,假如願望這個新線程必定性的立刻履行,直接挪用本來線程的sleep(1)便可。
public class ThreadTest {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 30) {
thread.start();
try {
Thread.sleep(1); // 使得thread必定可以或許立時得以履行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
注:睡一個毫秒級夠了,由於CPU不會余暇,會切換到新建的線程。
3.後台線程(Daemon Thread)
概念/目標:後台線程重要是為其他線程(絕對可以稱之為前台線程)供給辦事,或“守護線程”。如JVM中的渣滓收受接管線程。
性命周期:後台線程的性命周期與前台線程性命周期有必定聯系關系。重要表現在:當一切的前台線程都進入逝世亡狀況時,後台線程會主動逝世亡(其實這個也很好懂得,由於後台線程存在的目標在於為前台線程辦事的,既然一切的前台線程都逝世亡了,那它本身還留著有甚麼用...巨大啊 ! !)。
設置後台線程:挪用Thread對象的setDaemon(true)辦法可以將指定的線程設置為後台線程。
public class ThreadTest {
public static void main(String[] args) {
Thread myThread = new MyThread();
for (int i = 0; i < 100; i++) {
System.out.println("main thread i = " + i);
if (i == 20) {
myThread.setDaemon(true);
myThread.start();
}
}
}
}
class MyThread extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("i = " + i);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
斷定線程能否是後台線程:挪用thread對象的isDeamon()辦法。
注:main線程默許是前台線程,前台線程創立中創立的子線程默許是前台線程,後台線程中創立的線程默許是後台線程。挪用setDeamon(true)辦法將前台線程設置為後台線程時,須要在start()辦法挪用之前。前天線程都逝世亡後,JVM告訴後台線程逝世亡,但從吸收指令到作出呼應,須要必定的時光。
4.轉變線程的優先級/setPriority():
每一個線程在履行時都具有必定的優先級,優先級高的線程具有較多的履行機遇。每一個線程默許的優先級都與創立它的線程的優先級雷同。main線程默許具有通俗優先級。
設置線程優先級:setPriority(int priorityLevel)。參數priorityLevel規模在1-10之間,經常使用的有以下三個靜態常量值:
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5
獲得線程優先級:getPriority()。
注:具有較高線程優先級的線程對象僅表現此線程具有較多的履行機遇,而非優先履行。
public class ThreadTest {
public static void main(String[] args) {
Thread myThread = new MyThread();
for (int i = 0; i < 100; i++) {
System.out.println("main thread i = " + i);
if (i == 20) {
myThread.setPriority(Thread.MAX_PRIORITY);
myThread.start();
}
}
}
}
class MyThread extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("i = " + i);
}
}
}
5.線程妥協:yield()
上一篇博文中曾經講到了yield()的根本感化,同時,yield()辦法還與線程優先級有關,當某個線程挪用yiled()辦法從運轉狀況轉換到停當狀況後,CPU從停當狀況線程隊列中只會選擇與該線程優先級雷同或優先級更高的線程去履行。
public class ThreadTest {
public static void main(String[] args) {
Thread myThread1 = new MyThread1();
Thread myThread2 = new MyThread2();
myThread1.setPriority(Thread.MAX_PRIORITY);
myThread2.setPriority(Thread.MIN_PRIORITY);
for (int i = 0; i < 100; i++) {
System.out.println("main thread i = " + i);
if (i == 20) {
myThread1.start();
myThread2.start();
Thread.yield();
}
}
}
}
class MyThread1 extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("myThread 1 -- i = " + i);
}
}
}
class MyThread2 extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("myThread 2 -- i = " + i);
}
}
}
系列文章:
java 多線程實例講授 (一)
Java 多線程實例詳解(二)
Java 多線程實例詳解(三)