一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java 多線程實例詳解(二)

Java 多線程實例詳解(二)

2020-06-11 15:41Corn JAVA教程

本文主要介紹Java 多線程的資料整理,這里整理了詳細資料及相關示例代碼,有興趣的小伙伴可以參考下

本文承接上一篇文章《Java多線程實例詳解(一)》。

四.Java多線程的阻塞狀態與線程控制

上文已經提到Java阻塞的幾種具體類型。下面分別看下引起Java線程阻塞的主要方法。

1.join()

join —— 讓一個線程等待另一個線程完成才繼續執行。如A線程線程執行體中調用B線程的join()方法,則A線程被阻塞,知道B線程執行完為止,A才能得以繼續執行。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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)即可。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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)方法可以將指定的線程設置為后臺線程。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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()。

注:具有較高線程優先級的線程對象僅表示此線程具有較多的執行機會,而非優先執行。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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從就緒狀態線程隊列中只會選擇與該線程優先級相同或優先級更高的線程去執行。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 多線程實例詳解(三)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎地址| 男人的天堂在线观看免费 | 息与子中文字幕完整在线 | 国产精品天天在线 | 男人晚上适合偷偷看的污污 | 久久青青草原综合伊人 | 日本激情网站 | 国内视频一区二区三区 | 欧美怡红院视频一区二区三区 | 亚洲精品国产AV成人毛片 | 四虎精品视频在线永久免费观看 | 国产成人小视频 | 色屁屁二区 | 国产欧美精品一区二区三区四区 | 99热在线观看免费 | 欧美日韩国产在线人成dvd | 久久精麻豆亚洲AV国产品 | 婷婷丁香视频 | 久久精品中文闷骚内射 | 国产一卡2卡3卡四卡精品网 | 久久精品视在线观看85 | 1024免费福利永久观看网站 | 四虎免费在线观看视频 | 亚洲欧美日韩高清 | 亚欧美色 | 亚洲嫩模吧粉嫩粉嫩冒白浆 | 91国在线观看 | 精品9e精品视频在线观看 | 亚洲成人综合在线 | 91制片厂果冻传媒杨柳作品 | 热久久最新网址 | 亚洲成人中文 | 天美传媒果冻传媒星空传媒 | 亚洲九九九| 苍井空av| 免费一级欧美片片线观看 | 四虎最新紧急更新地址 | 性xxx免费视频 | 亚洲精品中文字幕久久久久久 | 欧美一级视频在线高清观看 | 国内精品 大秀视频 日韩精品 |