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

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

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 多線程實例詳解(三)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 8天堂资源在线官网 | 欧美久久天天综合香蕉伊 | 亚洲色图首页 | 男生同性啪视频在线观看 | 国产亚洲综合精品一区二区三区 | 草莓丝瓜芭乐樱桃榴莲色多黄 | 扒开女人下面使劲桶屁股动漫 | 色成人综合网 | 无套内射在线观看THEPORN | 国产亚洲综合成人91精品 | 调教全程肉动画片在线观看 | 精品乱lun小说 | 护士xxxx | 水蜜臀| 亚洲欧美优优色在线影院 | 日本阿v精品视频在线观看 日本xxx片免费高清在线 | 校花被扒开尿口折磨憋尿 | 国产午夜一区二区在线观看 | 精品成人网 | 513热点网深夜影院影院诶 | 青青青国产手机在线播放 | 国产精品福利久久2020 | 免费xxxx日本大片在线观看 | 国内自拍2020 | 精品免费视在线观看 | 精品国产欧美一区二区五十路 | 好逼天天有 | 亚洲国产成人超福利久久精品 | 日韩毛片大全免费高清 | 国产乱插| 女同久久另类99精品国产 | 搡60一70岁的老女人小说 | 国产色司机在线视频免费观看 | 成人精品mv视频在线观看 | 99久久国产综合精麻豆 | 精品国产原创在线观看视频 | 亚飞与亚基高清国语在线观看 | 特黄特黄aaaa级毛片免费看 | 亚洲视频高清 | 性福演算法 | 国产视频久久 |