當前位置:首頁 » 編程語言 » java多線程詳解

java多線程詳解

發布時間: 2022-05-18 21:05:28

① 如何掌握java多線程,高並發,大數據方面的技能

總是看見有部分sb要回答你不能好好回答。不知道你丫能不能閉嘴?
多線程+並發,看java並發編程詳解,90%以上會java多線程的程序員都從這本書上學的。要考慮高並發,深刻理解多線程,並發,只有java的知識不夠,需要看操作系統核心編程之類的書籍,前提得會c編寫邊做邊理解。操作系統底層給它扒個底朝天。java的多線程是基於操作系統的,換句話說java的多線程依賴操作系統的多線程實現。操作系統核心編程(windows)或操作系統高級編程(unix系的)會把操作系統的運行原理說得很透徹,當然包括線程。
除了上面的知識,還需要深刻了解tcp/ip協議以及套接字編程,以及常用的tcp,udp,sctp的應用,如http,ftp,smtp,pop3,rpc等等應用級協議。
大數據需要資料庫支撐,資料庫的先會吧!這個一班不重要。大數據著塊重要的功能是如何,使用分析海量數據提取有用信息。需要針對不同領域做分析使用。比如一個氣象數據,對賣空調、賣冰箱的人他們關心啥,要能提供對應的數據給他們。對賣服裝的人,他們又關心啥?要提供哪些數據給他們?對農名,他們又關心啥,要提供哪些數據給他們?說大底。大數據所關心的問題是如何提供有效服務(掙錢點),需要了解很多具體行業知識。
(處理大數據的程序,略過,真不是太難的事,你學得懂第二,第三段描述的內容,要理解大數據的一些代碼架構實現不難)

② java考試

復習題
1、多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼?
答:多線程有兩種實現方法,分別是繼承Thread類與實現Runnable介面
同步的實現方面有兩種,分別是synchronized,wait與notify
2、線程的基本概念、線程的基本狀態以及狀態之間的關系
答:線程指在程序執行過程中,能夠執行程序代碼的一個執行單位,每個程序至少都有一個線程,也就是程序本身。
Java中的線程有四種狀態分別是:運行、就緒、掛起、結束
3、sleep() 和 wait() 有什麼區別?
答:sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。
wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池准備獲得對象鎖進入運行狀態。
4、當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?
答:不能,一個對象的一個synchronized方法只能由一個線程訪問
5、Thread和Runnable有什麼不同?
JAVA線程式控制制著程序執行的主路徑。當你用java命令調用JVM時,JVM創建了一個隱式線程來執行main方法。Thread類提供了主線程調用其它線程並行運行的機制。
Runnable介面定義了一個能被Thread運行的類。實現Runnable的類只需要實行run方法。可以很靈活的擴展現在的已經繼承自其它父類的類。而thread則不可以,因為java只允許繼承一個父類。
6、啟動一個線程是用run()還是start()?
答:啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處於可運行狀態,這意味著它可以由JVM調度並執行。這並不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。
7、請說出你所知道的線程同步的方法。
答:wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。
sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先順序。
Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。

8、在Java中允許創建多線程應用程序的介面是()。
【A】Threadable 【B】Runnable
【C】Clonable 【D】以上均不是
【解析】A
9、在JAVA編程中,實現Runnable介面時必須實現的方法是()。
【A】wait() 【B】run()
【C】stop() 【D】start()
【解析】B
10、JAVA線程編程中,如果讓線程睡眠,可以用()方法實現。
【A】start() 【B】close();
【C】setDaemon(); 【D】sleep();
【解析】D
11、編譯運行下面的代碼會發生什麼
public class Test extends Thread {
private String sThreadName;
public static void main(String args[]) {
Test h = new Test();
h.go();
}
Test() {
}
Test(String s) {
sThreadName = s;
}
public String getThreadName() {
return sThreadName;
}
public void go() {
Test first = new Test("first");
first.start();
Test second = new Test("second");
second.start();
}
public void start() {
for (int i = 0; i < 2; i++) {
System.out.println(getThreadName() + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
}
}
【A】編譯錯誤
【B】輸出first0, second0, first1, second1
【C】輸出first0, first1, second0, second1
【D】運行時錯誤
答案:C。
12、編譯運行下面的代碼會發生什麼
public class Test {
public static void main(String argv[]) {
Pmcraven pm1 = new Pmcraven("one");
pm1.run();
Pmcraven pm2 = new Pmcraven("two");
pm2.run();
}
}
class Pmcraven extends Thread {
private String sTname = "";
Pmcraven(String s) {
sTname = s;
}
public void run() {
for (int i = 0; i < 2; i++) {
try {
sleep(1000);
} catch (InterruptedException e) {
}
yield();
System.out.println(sTname);
}
}
}
【A】編譯錯誤 【B】輸出One One Two Two
【C】輸出One Two One Two 【D】輸出One Two One Two
答案B
13、一個完整的URL地址由哪幾部分組成?
答:一個完整的URL由4部分組成:資源類型、存放資源的主機域名、資源文件名和埠。
其中:資源類型:指服務協議類型,如Web伺服器的http協議。
主機域名:一般給出伺服器主機的名稱或IP號。
資源文件名:給出要查詢的文件的相對路徑以及名稱。
埠:伺服器的整型埠號,通常只有使用非標准埠時才指定。
例如:http://192.168.1.220:80/index.html
其中:http是伺服器採用http協議、「192.168.1.220」是伺服器的IP號、「index.html」伺服器的根位置文件index.html、80為埠號。
14、建立Socket對象和ServerSocket對象的工作步驟分別是那些。
書籍P38-39
15、套接字包括( )
【A】埠號 【B】IP地址
【C】埠號和IP地址 【D】都不是
答案C
16、等待客戶端請求連接,伺服器可以使用的類是( )
【A】Socket 【B】ServerSocket
【C】Server 【D】URL
答案B
17、ServerSocket的accept()方法返回的對象類型是( )
【A】Socket 【B】ServerSocket
【C】Server 【D】URL
答案A
18、用來封裝計算機IP地址和域名的類是( )
【A】Socket 【B】InetAddress
【C】URLConnection 【D】URL
答案A
19、Java中的事件處理機制?
答:事件從事件源到監聽者的傳遞是通過對目標監聽者對象的Java 方法調用進行的。對每個明確的事件的發生,都相應地定義一個明確的Java 方法。這些方法都集中定義在事件監聽者介面(EventListener Interface)中,這個介面要繼承java.util.EventListener。實現了事件監聽者介面中一些或全部方法的類就是事件監聽者。伴隨著事件的發生,相應的狀態通常都封裝在事件狀態對象(Event State Object)中,該對象必須繼承自java.util.EventObject。事件狀態對象作為單參傳遞給應響應該事件的監聽者方法中。發出某種特定事件的事件源的標識是:遵從規定的設計格式為事件監聽者定義注冊方法,並接受對指定事件監聽者介面實例的引用。有時,事件監聽者不能直接實現事件監聽者介面,或者還有其它的額外動作時,就要在一個源與其它一個或多個監聽者之間插入一個事件適配器類的實例,來建立它們之間的聯系。
20、簡述適配器和監聽介面的區別。

21、下面( )方法用於獲得事件源。
【A】getEvent() 【B】getCommand()
【C】getText() 【D】getSource()
答案D
22、下述代碼中,如果單擊「TEST」按鈕,標准輸出的消息是( )
public class Exercise extends JFrame{
public Exercise(){
super("事件測試");
Button b=new Button("TEST ");
b.addMouseListener(new Tester());
this.add(b);
this.setSize(200,150);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
class Tester implements MouseListener{
public void actionPerformed(ActionEvent e){
System.out.println("按鈕發生動作");
}
public void mouseClicked(MouseEvent e){
System.out.println("按鈕被單擊");
}
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
}
【A】"按鈕發生動作" 【B】"按鈕被單擊"
【C】"按鈕發生動作"和"按鈕被單擊" 【D】以上都不對
答案B
23、試描述創建一個菜單的步驟。
書籍P95
24、簡述實現一個JDialog對話框的步驟。
書籍P104
25、在正則表達式中,( )符號用於匹配單個字元。
【A】. 【B】?
【C】* 【D】+
答案B
26、下面( )符號用於匹配一次或多次。
【A】. 【B】?
【C】* 【D】+
答案D
27、下述正則表達式為:
(\d{1,3}\.){3}\d{1,3}
給出正則表達式描述的匹配字元( )。
註:\d 匹配數字字元(0~9);{n}匹配確定的n次,n是一個非負整數
{n,m}最少匹配n次且最多匹配m次,m和n均為非負整數,其中n≤m

③ 什麼是java多線程詳解

線程對象是可以產生線程的對象。比如在Java平台中Thread對象,Runnable對象。線程,是指正在執行的一個指點令序列。在java平台上是指從一個線程對象的start()開始,運行run方法體中的那一段相對獨立的過程。相比於多進程,多線程的優勢有:
(1)進程之間不能共享數據,線程可以;
(2)系統創建進程需要為該進程重新分配系統資源,故創建線程代價比較小;
(3)Java語言內置了多線程功能支持,簡化了java多線程編程。
一、創建線程和啟動
(1)繼承Thread類創建線程類
通過繼承Thread類創建線程類的具體步驟和具體代碼如下:
• 定義一個繼承Thread類的子類,並重寫該類的run()方法;
• 創建Thread子類的實例,即創建了線程對象;
• 調用該線程對象的start()方法啟動線程。
復制代碼
class SomeThead extends Thraad {
public void run() {
//do something here
}
}

public static void main(String[] args){
SomeThread oneThread = new SomeThread();
步驟3:啟動線程:
oneThread.start();
}
復制代碼
(2)實現Runnable介面創建線程類
通過實現Runnable介面創建線程類的具體步驟和具體代碼如下:
• 定義Runnable介面的實現類,並重寫該介面的run()方法;
• 創建Runnable實現類的實例,並以此實例作為Thread的target對象,即該Thread對象才是真正的線程對象。
復制代碼
class SomeRunnable implements Runnable {
public void run() {
//do something here
}
}
Runnable oneRunnable = new SomeRunnable();
Thread oneThread = new Thread(oneRunnable);
oneThread.start();
復制代碼
(3)通過Callable和Future創建線程
通過Callable和Future創建線程的具體步驟和具體代碼如下:
• 創建Callable介面的實現類,並實現call()方法,該call()方法將作為線程執行體,並且有返回值。
• 創建Callable實現類的實例,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法的返回值。
• 使用FutureTask對象作為Thread對象的target創建並啟動新線程。
• 調用FutureTask對象的get()方法來獲得子線程執行結束後的返回值其中,Callable介面(也只有一個方法)定義如下:
復制代碼
public interface Callable {
V call() throws Exception;
}
步驟1:創建實現Callable介面的類SomeCallable(略);
步驟2:創建一個類對象:
Callable oneCallable = new SomeCallable();
步驟3:由Callable創建一個FutureTask對象:
FutureTask oneTask = new FutureTask(oneCallable);
注釋: FutureTask是一個包裝器,它通過接受Callable來創建,它同時實現了 Future和Runnable介面。
步驟4:由FutureTask創建一個Thread對象:
Thread oneThread = new Thread(oneTask);
步驟5:啟動線程:
oneThread.start();

④ java學習作為一名java初學者,如何快速學習j

那首先來了解一下什麼是java:

Java是SUN(Stanford University Network,斯坦福大學網路公司)1995年推出的一門高級編程語言,是一種面向Internet的編程語言。隨著Java技術在web方面的不斷成熟,已經成為Web應用程序的首選開發語言。

那麼為什麼要使用這個語言呢,Java語言的特點跨平台性,通過Java語言編寫的應用程序在不同的系統平台上都可以運行。原理是只要在需要運行java應用程序的操作系統上,先安裝一個Java虛擬機(JVM Java Virtual Machine)即可。由JVM來負責Java程序在該系統中的運行。

下面對java學習進行一次史無前例的剖析,細致的講解零基礎的人怎麼學習Java。先看下Java在基礎階段的知識點路線圖。

⑤ java怎樣使用線程統計已解析完成的數量

三種方法:1。 使用top命令,具體用法是 top -H 加上這個選項,top的每一行就不是顯示一個進程,而是一個線程。 2。 使用ps命令,具體用法是 ps -xH 這樣可以查看所有存在的線程,也可以使用grep作進一步的過濾。

⑥ java多線程問題,如下解析,我是否可以理解為如果類是繼承Thread的那麼run()方法不執行任何操作並返回

線程具體做什麼本身就是你自己重寫run方法。
不管你是繼承Thread類,還是實現Runnable介面,重寫了run方法,讓線程執行自己編寫的代碼

⑦ java常用的幾種線程池實例講解

下面給你介紹4種線程池:

1、newCachedThreadPool:

  • 底層:返回ThreadPoolExecutor實例,corePoolSize為0;maximumPoolSize為Integer.MAX_VALUE;keepAliveTime為60L;unit為TimeUnit.SECONDS;workQueue為SynchronousQueue(同步隊列)

  • 通俗:當有新任務到來,則插入到SynchronousQueue中,由於SynchronousQueue是同步隊列,因此會在池中尋找可用線程來執行,若有可以線程則執行,若沒有可用線程則創建一個線程來執行該任務;若池中線程空閑時間超過指定大小,則該線程會被銷毀。

  • 適用:執行很多短期非同步的小程序或者負載較輕的伺服器

2、newFixedThreadPool:


  • 底層:返回ThreadPoolExecutor實例,接收參數為所設定線程數量nThread,corePoolSize為nThread,maximumPoolSize為nThread;keepAliveTime為0L(不限時);unit為:TimeUnit.MILLISECONDS;WorkQueue為:new LinkedBlockingQueue<Runnable>()無解阻塞隊列

  • 通俗:創建可容納固定數量線程的池子,每隔線程的存活時間是無限的,當池子滿了就不在添加線程了;如果池中的所有線程均在繁忙狀態,對於新任務會進入阻塞隊列中(無界的阻塞隊列)

  • 適用:執行長期的任務,性能好很多

3、newSingleThreadExecutor

  • 底層:包裝的ThreadPoolExecutor實例,corePoolSize為1;maximumPoolSize為1;keepAliveTime為0L;unit為:TimeUnit.MILLISECONDS;workQueue為:new LinkedBlockingQueue<Runnable>()無解阻塞隊列

  • 通俗:創建只有一個線程的線程池,且線程的存活時間是無限的;當該線程正繁忙時,對於新任務會進入阻塞隊列中(無界的阻塞隊列)

  • 適用:一個任務一個任務執行的場景

4、NewScheledThreadPool:

  • 底層:創建ScheledThreadPoolExecutor實例,corePoolSize為傳遞來的參數,maximumPoolSize為Integer.MAX_VALUE;keepAliveTime為0;unit為:TimeUnit.NANOSECONDS;workQueue為:new DelayedWorkQueue()一個按超時時間升序排序的隊列

  • 通俗:創建一個固定大小的線程池,線程池內線程存活時間無限制,線程池可以支持定時及周期性任務執行,如果所有線程均處於繁忙狀態,對於新任務會進入DelayedWorkQueue隊列中,這是一種按照超時時間排序的隊列結構

  • 適用:周期性執行任務的場景

最後給你說一下線程池任務執行流程:

  • 當線程池小於corePoolSize時,新提交任務將創建一個新線程執行任務,即使此時線程池中存在空閑線程。

  • 當線程池達到corePoolSize時,新提交任務將被放入workQueue中,等待線程池中任務調度執行

  • 當workQueue已滿,且maximumPoolSize>corePoolSize時,新提交任務會創建新線程執行任務

  • 當提交任務數超過maximumPoolSize時,新提交任務由RejectedExecutionHandler處理

  • 當線程池中超過corePoolSize線程,空閑時間達到keepAliveTime時,關閉空閑線程

  • 當設置allowCoreThreadTimeOut(true)時,線程池中corePoolSize線程空閑時間達到keepAliveTime也將關閉

熱點內容
神秘顧客訪問 發布:2025-05-15 20:33:39 瀏覽:296
安卓市場手機版從哪裡下載 發布:2025-05-15 20:17:28 瀏覽:814
幼兒速演算法 發布:2025-05-15 20:15:08 瀏覽:86
best把槍密碼多少 發布:2025-05-15 20:13:42 瀏覽:548
android安裝程序 發布:2025-05-15 20:13:20 瀏覽:559
c語言跳出死循環 發布:2025-05-15 20:06:04 瀏覽:824
a19處理器相當於安卓哪個水平 發布:2025-05-15 20:05:29 瀏覽:639
榮耀9i安卓強行關機按哪個鍵 發布:2025-05-15 20:00:32 瀏覽:750
密碼鎖寫什麼最好 發布:2025-05-15 19:05:31 瀏覽:783
5的源碼是 發布:2025-05-15 19:04:07 瀏覽:719