Java並發編程(一)

來源:互聯網
上載者:User

標籤:jobs   color   結果   分發   ade   lan   text   並且   接收   

1、定義                                                                                                  

線程是現代作業系統調用的最小單位,也叫輕量級進程,在一個進程裡可以建立多個線程,這些線程都擁有各自的計數器、堆棧和局部變數等屬性,並且能夠訪問共用的記憶體變數。

2、一個普通的java程式中包含哪些線程                                               

下面是在jdk1.8.0_60環境下的代碼輸出。

 1 import java.lang.management.ManagementFactory; 2 import java.lang.management.ThreadInfo; 3 import java.lang.management.ThreadMXBean; 4  5 public class MultiThread { 6     public static void main(String[] args) { 7         // 擷取java線程管理MXBean 8         ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); 9         ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);10         // 遍曆線程資訊,僅列印線程ID和線程名稱資訊11         for (ThreadInfo threadInfo : threadInfos) {12             System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());13         }14         System.out.println(System.getProperty("java.version"));15     }16 }

輸出結果:

[5] Attach Listener       //負責接收到外部的命令,對該命令進行執行然後把結果返回給寄件者[4] Signal Dispatcher     //分發處理髮送給JVM訊號的線程[3] Finalizer             //調用對象finalize方法的線程[2] Reference Handler     //清除Reference的線程[1] main                  //main線程,使用者程式入口1.8.0_60                  //jdk版本號碼

3、優先順序                                                                                            

在Java線程中,通過一個整型成員變數priority來控制優先順序,優先順序的範圍從1-10,線上程構建的時候可以通過setPriority(int)方法來修改優先順序,預設優先順序是5,優先順序高的線程分配時間片的數量要多餘優先順序低的線程。在不同的JVM以及作業系統上,線程規劃會存在差異,有些作業系統甚至會忽略線程優先順序的設定。

4、優先順序例子                                                                                     

我的電腦是win7,64,jdk1.8,輸出結果表明優先順序生效了。

 

 1 package thread; 2  3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.concurrent.TimeUnit; 6  7 public class Priority { 8     private static volatile boolean notStart = true; 9     private static volatile boolean notEnd = true;10     11     static class Job implements Runnable{12         private int priority;13         private long jobCount;14         public Job(int priority){15             this.priority = priority;16         }17         @Override18         public void run() {19             while(notStart){20                 Thread.yield();21             }22             while(notEnd){23                 Thread.yield();24                 jobCount++;25             }26         }27     }28     public static void main(String[] args) throws InterruptedException {29         List<Job> jobs = new ArrayList<Job>();30         for(int i = 0; i < 10; i++){31             //設定優先權32             int priority = i < 5 ? Thread.MIN_PRIORITY:Thread.MAX_PRIORITY;33             Job job = new Job(priority);34             jobs.add(job);35             Thread thread = new Thread(job,"Thread:" + i);36             thread.setPriority(priority);37             thread.start();38         }39         notStart = false;40         TimeUnit.SECONDS.sleep(2);41         notEnd = false;42         for(Job job : jobs){43             System.out.println("Job Priority : " + job.priority 44                     + ", Count : " + job.jobCount);45         }46     }47 }

 

輸出結果

 1 Job Priority : 1, Count : 6607305 2 Job Priority : 1, Count : 3393520 3 Job Priority : 1, Count : 11684488 4 Job Priority : 1, Count : 8878447 5 Job Priority : 1, Count : 6607130 6 Job Priority : 10, Count : 12661281 7 Job Priority : 10, Count : 12467001 8 Job Priority : 10, Count : 12306292 9 Job Priority : 10, Count : 1242501110 Job Priority : 10, Count : 12817522

5、線程的狀態                                                                                            

java線程在啟動並執行生命週期中可能處於一下6種不同的狀態,某一刻只能是其中的一個狀態。

NEW:初始狀態,線程被構建,但是還沒有調用start()方法;

RUNNABLE:運行狀態,java線程將作業系統中的就緒和運行兩種狀態籠統地稱作“運行中”;

BLOCKED:阻塞狀態,表示線程阻塞於鎖;

WAITING:等待狀態,表示線程進入等待狀態,進入該狀態表示當前線程需要等待其他線程做出一些特定動作(通知或中斷);

TIME_WATING:逾時等待狀態,該狀態不同於WAITING,它是可以在指定的時間自行返回的;

TERMINATED:終止狀態,表示當前線程已經執行完畢。

 6、啟動和終止線程                                                                                    

構造線程:一個新構造的線程對象是由其parent線程來進行空間分配的,而child線程繼承了parent是否為Daemon(守護線程)、優先順序和載入資源的contextClassLoader以及可繼承的ThreadLocal,同時還會分配一個唯一的ID來標識這個child線程。

啟動線程:調用start()方法,其含義是:當前線程(即parent線程)同步告知Java虛擬機器,只要縣城規劃器空閑,應立即啟動調用start()方法的線程。

到期的suspend()、resume()、stop():不建議使用,以suspend方法為例,在調用後,線程不會釋放已經佔有的資源(比如鎖),而是佔有著資源進入睡眠狀態,這樣容易引起死結問題。同樣,stop方法在終結一個線程時不會保證線程資源正常釋放,通常是沒有給予線程完成資源釋放工作的機會,因此會導致程式可能工作在不確定狀態下。

 

Java並發編程(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.