程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java線程的掌握詳解

Java線程的掌握詳解

編輯:關於JAVA

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之間的數字,而應用靜態常量,以包管具有優越的可移植性。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved