本文目錄一覽:
- 1、java 在類中直接static{}和{}的區別在哪?
- 2、java在類中聲明一個整數數組作為成員變量,如果沒有給它賦值,數值元素值為空,這句話為什麼是錯誤的
- 3、Java語言一般應用在哪些方面呢?
- 4、java主要用在哪裡?
- 5、Java裡面的line在哪兒
- 6、如何在 Java 中正確使用 wait,notify 和 notifyAll
java 在類中直接static{}和{}的區別在哪?
區別如下:
static{ //靜態代碼塊,優先於普通代碼塊執行,靜態代碼塊中使用的變量必須是靜態變量。
//一般是為了加載properties文件信息,只會被執行一次。}
{ //普通代碼塊,在靜態代碼塊之後執行,在構造函數之前執行,所以執行順序是【靜態代碼塊-普通代碼塊-構造函數】
//每次new一個對象都會執行一次
}
java在類中聲明一個整數數組作為成員變量,如果沒有給它賦值,數值元素值為空,這句話為什麼是錯誤的
錯誤的原因是:
聲明一個整數數組,如果沒有賦值,數值元素都為0,不是null。
當編輯並運行一個Java程序時,需要同時涉及到這四種方面。使用文字編輯軟件(例如記事本、寫字板、UltraEdit等)或集成開發環境(Eclipse、MyEclipse等)在Java源文件中定義不同的類。
通過調用類(這些類實現了Java API)中的方法來訪問資源系統,把源文件編譯生成一種二進制中間碼。
存儲在class文件中,然後再通過運行與操作系統平台環境相對應的Java虛擬機來運行class文件,執行編譯產生的字節碼,調用class文件中實現的方法來滿足程序的Java API調用。
擴展資料:
自增和自減是單目運算符,可以放在操作元之前,也可以放在操作元之後。操作元必須是一個整型或浮點型變量。自增、自減運算符的作用是使變量的值增1或減1。
放在操作元前面的自增、自減運算符,會先將變量的值加1或減1,然後再使該變量參與表達式的運算。放在操作元後面的自增、自減運算符,會先使變量參與表達式的運算,然後再將該變量的值加1或減1。
Java語言一般應用在哪些方面呢?
Java開發應用的方面非常廣泛,包括以下幾大方向:桌面應用系統開發、嵌入式系統開發、電子商務應用、企業級應用開發、交互式系統開發、多媒體系統開發、分布式系統開發、Web應用系統開發。
Java軟件工程師就業前景的好壞主要從Java的應用領域來看,Java語言的應用方向主要表現在以下三個方面:
1. 大中型的商業應用包括我們常說的企業級應用(主要指複雜的大企業的軟件系統)、各種類型的網站,Java的安全機制以及它的跨平台的優勢使它在分布式系統領域開發中有廣泛應用。
2. 桌面應用就是常說的C/S應用主要用來開發運行於不同的操作系統上的桌面應用程序。
3. 移動領域應用主要表現在消費和嵌入式領域是指在各種小型設備上的應用包括手機、PDA、機頂盒、汽車通信設備等。
因此,對於擁有Java技術的程序員來說,職業道路的選擇十分的寬廣,行業前景之廣闊都是可以預見。所以,趕快抓住機會學習Java開發吧!
java主要用在哪裡?
在現實社會中有很多地方使用到了Java,從電子商務網站到Androidapps,從科學應用到金融產品,例如電子交易系統,從類似Minecraft的遊戲再到Eclipse,Netbeans和IntelliJ的桌面應用,從開源的資源庫到J2MEapps等等。下面帶你一起詳細了解Java的應用領域。
1、嵌入式領域
Java在嵌入式領域也有很大的應用。你只需要130KB就能夠使用Java技術(在一塊小的芯片或者傳感器上),這顯示了這個平台是多麼的可靠。Java最初是為了嵌入式設備而設計的。
事實上,這也是Java最初的一項“立即編寫,隨處運行”主旨的一部分。
2、大數據技術
Hadoop和其他的大數據技術也在不同程度使用着Java,例如Apache的基於Java的Hbase,Accumulo(開源),以及ElasticSearch。 但是Java並沒有佔領整個領域,還有其他的大數據技術例如MongoDB就是使用C++編寫的.如果Hadoopor和ElasticSearch逐漸發展,那麼Java就能有潛力在大數據技術領域上得到更大的發展空間。
3、軟件工具
很多有用的軟件和開發工具都是運用Java編寫和開發的,例如Ecilpse,InetelliJIdea和NetbansIDE.。我認為這些都是最經常使用的用Java編寫的桌面應用程序。就如上面所說,Swing曾經在圖形用戶界面的客戶端開發非常流行,它們大多數應用在金融服務領域以及投資銀行。雖然現在JavaFx正在逐漸地流行起來,但仍然無法替代Swing,而且C#已經在大部分金融領域中代替了Swing。
4、網站應用
Java同樣也在電子商務和網站開發上有着廣泛的運用。你可以運用很多RESTfull架構,這些架構是用SpringMVC,Struts2.0和類似的框架開發出來的。 甚至簡單的Servlet,JSP和Struts在各種政府項目也是備受歡迎,許多政府,醫療,保險,教育,國防和其他部門的網站都是建立在Java之上的。
5、在金融服務行業的服務器應用
Java在金融服務業有着很大應用。很多的全球性投資銀行例如GoldmanSachs(高盛投資公司),Citigroup(花旗集團),Barclays(巴克萊銀行),StandardCharted(英國渣打銀行)和一些其他銀行都用Java編寫前台和後台的電子交易系統,結算、信息確認系統,數據處理項目和以及其他的項目。
Java被運用於編寫服務端應用,但大多數沒有前端,都是從一個服務端(上一級)接受數據,處理數據後發向其他的處理系統(下一級)。 JavaSwing由於能開發出圖形用戶界面的客戶端供交易者使用而備受歡迎,但是現在C#正在快速地取代Swing的市場,這讓Swing倍有壓力。
6、交易系統
第三方交易系統,金融服務行業的一大部分,同樣也是使用Java編寫的。例如像Murex這種受歡迎的交易系統,運用於與許多的銀行前端鏈接,同樣也是用Java編寫的。
7、J2MEApps
雖然IOS和Android的到來幾乎扼殺了J2ME的市場,但是仍然有很多的低端諾基亞和三星手機在使用着J2ME。 曾經有段時間大部分的遊戲,手機應用都是利用MIDP和CLDC,或者J2ME部分平台編寫的,以適用於Android系統。J2ME依然在藍光、磁卡、機頂盒等產品中流行着。app之所以如此流行是因為對於所有的諾基亞手機,app仍然適用於J2ME。
8、高頻交易領域
Java平台已經大大提高了性能特點和JITS,並且Java也擁有像C++級別的傳輸性能。因此,Java也流行於編寫高並發系統。 雖然Java的傳輸性能不比C++,但你可以不用考慮Java的安全性,可移植性和可維護性等問題(Java內部已經實現好了),而且Java有着更快的運行速度。安全性等問題會使一個沒有經驗的C++程序員編寫的應用程序變得更加緩慢和不可靠。
9、科學應用
現在Java經常是科學應用的默認選擇,包括了自然語言處理。這最主要的原因是因為Java比起C++或者其他語言有更加的安全,可移植,可維護,而且Java有着更好的高級並發工具。
10、安卓Apps
如果你想知道Java應用在哪裡,你離答案並不遠。打開你的安卓手機或者任何的App,它們完全是用有着谷歌AndroidAPI的Java編程語言編寫的,這個API和JDK非常相似。前幾年安卓剛開始起步而到今日已經很多Java程序員是安卓App的開發者。
Java作為軟件開發公司默認的開發語言,在金融服務行業、投資銀行和電子商務web應用領域獲得了很大應用,任何學習Java的人員都會為自己贏得光明的未來。
Java裡面的line在哪兒
在java工具欄裡面。
我們知道,java程序的啟動入口是main方法,我們其實已經可以通過main中的args參數來實現將外界變量傳入main方法內部了,那為什麼還需要CommandLine。因為args參數使用不夠方便,主要是因為其實現是一個數組,整個傳遞過程需要依賴順序。編程者和程序調用需要記憶參數的順序,才能正確傳遞參數。
當需要換行時,通常建議使用line。
如何在 Java 中正確使用 wait,notify 和 notifyAll
wait, notify 和 notifyAll,這些在多線程中被經常用到的保留關鍵字,在實際開發的時候很多時候卻並沒有被大家重視。本文對這些關鍵字的使用進行了描述。
在 Java 中可以用 wait、notify 和 notifyAll
來實現線程間的通信。。舉個例子,如果你的Java程序中有兩個線程——即生產者和消費者,那麼生產者可以通知消費者,讓消費者開始消耗數據,因為隊列緩
沖區中有內容待消費(不為空)。相應的,消費者可以通知生產者可以開始生成更多的數據,因為當它消耗掉某些數據後緩衝區不再為滿。
我們可以利用wait()來讓一個線程在某些條件下暫停運行。例如,在生產者消費者模型中,生產者線程在緩衝區為滿的時候,消費者在緩衝區為空的時
候,都應該暫停運行。如果某些線程在等待某些條件觸發,那當那些條件為真時,你可以用 notify 和 notifyAll
來通知那些等待中的線程重新開始運行。不同之處在於,notify 僅僅通知一個線程,並且我們不知道哪個線程會收到通知,然而 notifyAll
會通知所有等待中的線程。換言之,如果只有一個線程在等待一個信號燈,notify和notifyAll都會通知到這個線程。但如果多個線程在等待這個信
號燈,那麼notify只會通知到其中一個,而其它線程並不會收到任何通知,而notifyAll會喚醒所有等待中的線程。
在這篇文章中你將會學到如何使用 wait、notify 和 notifyAll 來實現線程間的通信,從而解決生產者消費者問題。如果你想要更深入地學習Java中的多線程同步問題,我強烈推薦閱讀Brian Goetz所著的《Java Concurrency in Practice | Java 並發實踐》,不讀這本書你的 Java 多線程征程就不完整哦!這是我最向Java開發者推薦的書之一。
如何使用Wait
儘管關於wait和notify的概念很基礎,它們也都是Object類的函數,但用它們來寫代碼卻並不簡單。如果你在面試中讓應聘者來手寫代碼,
用wait和notify解決生產者消費者問題,我幾乎可以肯定他們中的大多數都會無所適從或者犯下一些錯誤,例如在錯誤的地方使用
synchronized 關鍵詞,沒有對正確的對象使用wait,或者沒有遵循規範的代碼方法。說實話,這個問題對於不常使用它們的程序員來說確實令人感覺比較頭疼。
第一個問題就是,我們怎麼在代碼里使用wait()呢?因為wait()並不是Thread類下的函數,我們並不能使用
Thread.call()。事實上很多Java程序員都喜歡這麼寫,因為它們習慣了使用Thread.sleep(),所以他們會試圖使用wait()
來達成相同的目的,但很快他們就會發現這並不能順利解決問題。正確的方法是對在多線程間共享的那個Object來使用wait。在生產者消費者問題中,這
個共享的Object就是那個緩衝區隊列。
第二個問題是,既然我們應該在synchronized的函數或是對象里調用wait,那哪個對象應該被synchronized呢?答案是,那個
你希望上鎖的對象就應該被synchronized,即那個在多個線程間被共享的對象。在生產者消費者問題中,應該被synchronized的就是那個
緩衝區隊列。(我覺得這裡是英文原文有問題……本來那個句末就不應該是問號不然不太通……)
永遠在循環(loop)里調用 wait 和 notify,不是在 If 語句
現在你知道wait應該永遠在被synchronized的背景下和那個被多線程共享的對象上調用,下一個一定要記住的問題就是,你應該永遠在
while循環,而不是if語句中調用wait。因為線程是在某些條件下等待的——在我們的例子里,即“如果緩衝區隊列是滿的話,那麼生產者線程應該等
待”,你可能直覺就會寫一個if語句。但if語句存在一些微妙的小問題,導致即使條件沒被滿足,你的線程你也有可能被錯誤地喚醒。所以如果你不在線程被喚
醒後再次使用while循環檢查喚醒條件是否被滿足,你的程序就有可能會出錯——例如在緩衝區為滿的時候生產者繼續生成數據,或者緩衝區為空的時候消費者
開始小號數據。所以記住,永遠在while循環而不是if語句中使用wait!我會推薦閱讀《Effective Java》,這是關於如何正確使用wait和notify的最好的參考資料。
基於以上認知,下面這個是使用wait和notify函數的規範代碼模板:
// The standard idiom for calling the wait method in Java synchronized (sharedObject) { while (condition) { sharedObject.wait(); // (Releases lock, and reacquires on wakeup) } // do action based upon condition e.g. take or put into queue }
就像我之前說的一樣,在while循環里使用wait的目的,是在線程被喚醒的前後都持續檢查條件是否被滿足。如果條件並未改變,wait被調用之前notify的喚醒通知就來了,那麼這個線程並不能保證被喚醒,有可能會導致死鎖問題。
Java wait(), notify(), notifyAll() 範例
下面我們提供一個使用wait和notify的範例程序。在這個程序里,我們使用了上文所述的一些代碼規範。我們有兩個線程,分別名為
PRODUCER(生產者)和CONSUMER(消費者),他們分別繼承了了Producer和Consumer類,而Producer和
Consumer都繼承了Thread類。Producer和Consumer想要實現的代碼邏輯都在run()函數內。Main線程開始了生產者和消費
者線程,並聲明了一個LinkedList作為緩衝區隊列(在Java中,LinkedList實現了隊列的接口)。生產者在無限循環中持續往
LinkedList里插入隨機整數直到LinkedList滿。我們在while(queue.size ==
maxSize)循環語句中檢查這個條件。請注意到我們在做這個檢查條件之前已經在隊列對象上使用了synchronized關鍵詞,因而其它線程不能在
我們檢查條件時改變這個隊列。如果隊列滿了,那麼PRODUCER線程會在CONSUMER線程消耗掉隊列里的任意一個整數,並用notify來通知
PRODUCER線程之前持續等待。在我們的例子中,wait和notify都是使用在同一個共享對象上的。
import java.util.LinkedList; import java.util.Queue; import java.util.Random; /** * Simple Java program to demonstrate How to use wait, notify and notifyAll() * method in Java by solving producer consumer problem. * * @author Javin Paul */ public class ProducerConsumerInJava { public static void main(String args[]) { System.out.println(“How to use wait and notify method in Java”); System.out.println(“Solving Producer Consumper Problem”); QueueInteger buffer = new LinkedList(); int maxSize = 10; Thread producer = new Producer(buffer, maxSize, “PRODUCER”); Thread consumer = new Consumer(buffer, maxSize, “CONSUMER”); producer.start(); consumer.start(); } } /** * Producer Thread will keep producing values for Consumer * to consumer. It will use wait() method when Queue is full * and use notify() method to send notification to Consumer * Thread. * * @author WINDOWS 8 * */ class Producer extends Thread { private QueueInteger queue; private int maxSize; public Producer(QueueInteger queue, int maxSize, String name){ super(name); this.queue = queue; this.maxSize = maxSize; } @Override public void run() { while (true) { synchronized (queue) { while (queue.size() == maxSize) { try { System.out .println(“Queue is full, ” + “Producer thread waiting for ” + “consumer to take something from queue”); queue.wait(); } catch (Exception ex) { ex.printStackTrace(); } } Random random = new Random(); int i = random.nextInt(); System.out.println(“Producing value : ” + i); queue.add(i); queue.notifyAll(); } } } } /** * Consumer Thread will consumer values form shared queue. * It will also use wait() method to wait if queue is * empty. It will also use notify method to send * notification to producer thread after consuming values * from queue. * * @author WINDOWS 8 * */ class Consumer extends Thread { private QueueInteger queue; private int maxSize; public Consumer(QueueInteger queue, int maxSize, String name){ super(name); this.queue = queue; this.maxSize = maxSize; } @Override public void run() { while (true) { synchronized (queue) { while (queue.isEmpty()) { System.out.println(“Queue is empty,” + “Consumer thread is waiting” + ” for producer thread to put something in queue”); try { queue.wait(); } catch (Exception ex) { ex.printStackTrace(); } } System.out.println(“Consuming value : ” + queue.remove()); queue.notifyAll(); } } } }
為了更好地理解這個程序,我建議你在debug模式里跑這個程序。一旦你在debug模式下啟動程序,它會停止在PRODUCER或者
CONSUMER線程上,取決於哪個線程佔據了CPU。因為兩個線程都有wait()的條件,它們一定會停止,然後你就可以跑這個程序然後看發生什麼了
(很有可能它就會輸出我們以上展示的內容)。你也可以使用Eclipse里的Step into和Step over按鈕來更好地理解多線程間發生的事情。
本文重點:
1. 你可以使用wait和notify函數來實現線程間通信。你可以用它們來實現多線程(3)之間的通信。
2. 永遠在synchronized的函數或對象里使用wait、notify和notifyAll,不然Java虛擬機會生成 IllegalMonitorStateException。
3. 永遠在while循環里而不是if語句下使用wait。這樣,循環會在線程睡眠前後都檢查wait的條件,並在條件實際上並未改變的情況下處理喚醒通知。
4. 永遠在多線程間共享的對象(在生產者消費者模型里即緩衝區隊列)上使用wait。
5. 基於前文提及的理由,更傾向用 notifyAll(),而不是 notify()。
這是關於Java里如何使用wait,
notify和notifyAll的所有重點啦。你應該只在你知道自己要做什麼的情況下使用這些函數,不然Java里還有很多其它的用來解決同步問題的方
案。例如,如果你想使用生產者消費者模型的話,你也可以使用BlockingQueue,它會幫你處理所有的線程安全問題和流程控制。如果你想要某一個線
程等待另一個線程做出反饋再繼續運行,你也可以使用CycliBarrier或者CountDownLatch。如果你只是想保護某一個資源的話,你也可
以使用Semaphore。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/301878.html