Java線程的掌握詳解。本站提示廣大學習愛好者:(Java線程的掌握詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java線程的掌握詳解正文
1. join線程:
在線程履行進程中,有時想讓另外一個線程先履行,好比將一年夜成績朋分成很多小成績,給每個小成績分派線程,但一切小成績處置完後再讓主線程進一步操作。此時我們可以在主線程中挪用其它線程的join()辦法,以壅塞挪用線程(在這裡為主線程)。
示例代碼:
package org.frzh.thread;
public class JoinThread extends Thread{
//供給一個有參結構器,用來設置線程的名字
public JoinThread(String name) {
super(name);
}
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) {
//啟動子線程
new JoinThread("新線程").start();
for (int i = 0; i < 100; i++) {
if (i == 20) {
JoinThread jt = new JoinThread("被join的線程");
jt.start();
//main線程挪用了jt線程的join辦法,則main線程必需期待jt履行完以後能力履行
try {
jt.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " " +i);
}
}
}
原來有三套線程(兩便條線程和一main線程),當i=20後,main線程被壅塞必需比及“被join線程”履行完以後才無機會履行,所以爾後只要兩條線程履行。
join()辦法的三種重載情勢:
join():期待被join線程履行完;
join(long millis):期待被join線程履行最長為mills豪秒,在這以後即便被join線程沒有履行完也不再期待;
join(long millis, int nanos):期待被join線程履行最長時光為millis毫秒+nanos微秒。(此辦法根本用不上)。
2:後台線程:
有一種線程,他是在後台運轉,他的義務是為其他線程辦事,這類線程被稱為“後台線程”、“守護線程”或“精靈線程”。當一切前台線程都逝世亡後,後台線程會主動逝世亡。
示例代碼:
package org.frzh.thread;
public class DaemonThread extends Thread{
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(getName() + " " +i);
}
}
public static void main(String[] args) {
DaemonThread dt = new DaemonThread();
//將此線程設置為後台線程
dt.setDaemon(true);
dt.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
//前台線程停止,那末後台線程dt也會停止,所以它履行不到999
}
}
主線程默許是前台線程,前台線程創立的子線程默許是前台線程,後台線程創立的子線程默許是後台線程。
3.線程睡眠(sleep):
後面的join辦法是讓挪用線程期待被join線程履行完以後再持續履行,而sleep()辦法是讓挪用線程壅塞一段時光後再從新進入停當狀況期待被調劑。是以它平日用來暫停法式的履行。
示例代碼:
package org.frzh.thread;
import java.util.Date;
public class SleepThread{
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("以後時光:" + new Date());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
sleep()辦法的兩種重載方法:
static void sleep(long millis):讓以後線程暫停millis毫秒,並進入壅塞狀況。該辦法會遭到體系計時器和線程調劑器的精度和准度的影響。
static void sleep(long millis, int nanos):暫停mills毫秒+nanos微秒,並進入壅塞狀況,異樣會受體系計時器和線程調劑器的精度和准度的影響。根本不消。
4.線程妥協(yield):
yield()辦法和sleep辦法有點相似,它異樣可使以後正在運轉的線程暫停,但他不會壅塞該線程,只是將他轉入停當狀況(留意不是壅塞狀況)。yield()辦法只會讓和它一致優先級或更高優先級的線程有被履行的機遇,所以某一線程挪用該辦法後能夠又被從新調劑回來持續履行。
示例代碼:
package org.frzh.thread;
public class YieldThread extends Thread{
public YieldThread() {
}
public YieldThread(String name) {
super(name);
}
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " " +i);
if (i == 20) {
//以後線程妥協
Thread.yield();
}
}
}
public static void main(String[] args) {
//啟動兩條並發線程
YieldThread yt1 = new YieldThread("高等");
//設置yt1為最高優先級
yt1.setPriority(Thread.MAX_PRIORITY);
yt1.start();
YieldThread yt2 = new YieldThread("初級");
yt2.setPriority(Thread.MIN_PRIORITY);
yt2.start();
/*
* 假如不給線程設置優先級,則兩個線程的優先級是雷同的,所以兩線程會瓜代履行,當挪用yield後會讓另外一個線程履行;
* 然則,給兩個線程分離設置上述優先級以後,剛開端高等線程履行,當i=20時,挪用yield,但因為yield辦法只會
* 給和它同優先級或更高優先級的線程履行機遇,所以此時還是高等線程履行,而不會讓給初級線程
*/
}
}
5:轉變線程的優先級:
此舉比擬簡略,只需挪用挪用實例辦法setPriority(int priority)辦法便可。每一個線程默許與其父線程的優先級雷同,main線程默許具有通俗優先級(5)。java供給1~10個優先級,也能夠應用三個靜態常量:
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5
留意的是:雖然java供給10個優先級,然則分歧的體系支撐的優先級紛歧樣,所以盡可能防止直接應用1~10之間的數字,而應用靜態常量,以包管具有優越的可移植性。