粗大猛烈进出白浆视频,两性色午夜视频免费播放,国内精品一区二区三区在线观看,精品无人乱码一区二区三区的特点

思誠科技 seecen LOGO
咨詢熱線:0791-87557233
 您現(xiàn)在的位置:  首頁 > 職場人生 

關(guān)于線程的筆試面試題

來源:思誠科技    更新時間:2018-5-23

1.什么是線程?

概念:是程序執(zhí)行流的最小單元。

組成:一個標(biāo)準(zhǔn)的線程由線程ID,當(dāng)前指令指針(PC),寄存器集合和堆棧組成

狀態(tài):由于線程之間的相互制約,致使線程在運行中呈現(xiàn)出間斷性。線程也有就緒、阻塞運行三種基本狀態(tài)

周期:新建 就緒 運行 阻塞 死亡

思誠科技-多線程筆試題

2.多線程有什么用?

可以提高效率:涉及到CPUio等待

如果一個線程在執(zhí)行的時候遇到了阻塞(io等待),那么這個時候CPU會很閑,如果你設(shè)置了多線程的話,CPU可以在很閑的這個時間去處理其它線程,提高CPU的利用率。當(dāng)然,CPU在不同的線程之間進(jìn)行切換也是需要時間的,但是時間比較短,一般可以忽略

舉例子:某銀行處理數(shù)據(jù)同步的問題,每天凌晨銀行那邊會有幾十萬條數(shù)據(jù)發(fā)送過來進(jìn)行處理,幾百萬條數(shù)據(jù)接收后直接去處理了,每次運行大多都要耗費2.5個小時,時間實在太久,如果哪天有幾億數(shù)據(jù)是不是要跑幾十個小時了?那么就可以用多線程,切割這個數(shù)據(jù),利用不同的線程來處理,最后把時間縮短到了半小時左右

創(chuàng)建:Java中創(chuàng)建線程主要有三種方式:

繼承Thread類創(chuàng)建線程類,并重寫該類的run方法,該run()方法的方法體就代表了線程要完成的任務(wù)。調(diào)用線程對象的start()方法來啟動該線程。

②實現(xiàn)runnable接口,并重寫該接口的run()方法,該run()方法的方法體同樣是該線程的線程執(zhí)行體。調(diào)用線程對象的start()方法來啟動該線程。

③實現(xiàn)Callable接口,并實現(xiàn)call()方法,該call()方法將作為線程執(zhí)行體,并且有返回值。創(chuàng)建一個Callable實現(xiàn)類的實例對象,再使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法的返回值;

創(chuàng)建線程的三種方式的對比

采用實現(xiàn)Runnable、Callable接口的方式創(chuàng)見多線程時

優(yōu)勢是:

線程類只是實現(xiàn)了Runnable接口或Callable接口,還可以繼承其他類。

在這種方式下,多個線程可以共享同一個target對象,所以非常適合多個相同線程來處理同一份資源的情況,從而可以將CPU、代碼和數(shù)據(jù)分開,形成清晰的模型,較好地體現(xiàn)了面向?qū)ο蟮乃枷搿?/SPAN>

劣勢是:

編程稍微復(fù)雜,如果要訪問當(dāng)前線程,則必須使用Thread.currentThread()方法。

使用繼承Thread類的方式創(chuàng)建多線程時

優(yōu)勢是:

編寫簡單,如果需要訪問當(dāng)前線程,則無需使用Thread.currentThread()方法,直接使用this即可獲得當(dāng)前線程。

劣勢是:

線程類已經(jīng)繼承了Thread類,所以不能再繼承其他父類。

 

3.javawaitsleep方法的不同?

回答這個問題之前先了解線程的幾種主要狀態(tài):

線程主要有以下幾種狀態(tài): 
就緒(Runnable):線程準(zhǔn)備運行,不一定立馬就能開始執(zhí)行。

運行中(Running):進(jìn)程正在執(zhí)行線程的代碼。

等待中(Waiting):線程處于阻塞的狀態(tài),等待外部的處理結(jié)束。

睡眠中(Sleeping):線程被強制睡眠。

I/O阻塞(Blocked on I/O):等待I/O操作完成。

同步阻塞(Blocked on Synchronization):等待獲取鎖。

死亡(Dead):線程完成了執(zhí)行。

sleep()方法是來自Thread類的方法,因此它不能改變對象的鎖。所以當(dāng)在一個Synchronized方法中調(diào)用sleep()時,線程雖然休眠了,但是對象的鎖沒有被釋放,其他線程仍然無法訪問這個對象。

wait()方法則是來自Object類的方法,可以改變對象的鎖,會在線程休眠的同時釋放掉鎖,其他線程可以訪問該對象。

 

4.為什么我們調(diào)用start()方法時會執(zhí)行run()方法,為什么我們不能直接調(diào)用run()方法?

當(dāng)調(diào)用start()方法時,系統(tǒng)才會開啟一個線程,通過Thead類中start()方法來啟動的線程處于就緒狀態(tài)(可運行狀態(tài)),此時并沒有運行,一旦得到CPU時間片,就自動開始執(zhí)行run()方法

run()方法并沒有開啟一個線程,只是線程里的一個函數(shù),可以把run()方法看成是一個普通的方法,是繼承了Thread類之后我們自己重寫的方法。

區(qū)別就是:start() 創(chuàng)建新進(jìn)程 ,run() 沒有

 

5.線程與進(jìn)程的區(qū)別?

首先了解進(jìn)程執(zhí)行的背景CPU的速度非常的塊,如果有許多進(jìn)程等待處理,對于CPU來說就是每個進(jìn)程輪流這來,當(dāng)進(jìn)程得到CPU的時候,相關(guān)的資源必須也已經(jīng)就位,比如顯卡、GPS什么的必須已經(jīng)就位,然后CPU開始執(zhí)行。這里除了CPU以外所有的就構(gòu)成了這個程序的執(zhí)行環(huán)境,也就是我們所定義的程序上下文。當(dāng)這個程序執(zhí)行完了,或者分配給他的CPU執(zhí)行時間用完了,那它就要被切換出去,等待下一次CPU的臨幸。在被切換出去的最后一步工作就是保存程序上下文,因為這個是下次他被CPU運行的運行環(huán)境,必須保存。

進(jìn)程就是包括上下文切換的程序執(zhí)行時間總和 = CPU加載上下文+CPU執(zhí)行+CPU保存上下文
CPU執(zhí)行這個進(jìn)程的時候,不會是一個邏輯進(jìn)行到底的,就好比要實現(xiàn)程序甲,實際分成 a,b,c等多個塊組合而成。那么這里具體的執(zhí)行就可能變成:程序甲得到CPU =CPU加載上下文,開始執(zhí)行程序甲的a小段,然后執(zhí)行程序甲的b小段,然后再執(zhí)行程序甲的c小段,最后CPU保存程序甲的上下文。執(zhí)行完畢。

這里ab,c的執(zhí)行是共享了程序甲的上下文,CPU在執(zhí)行的時候沒有進(jìn)行上下文切換的。這里的a,b,c就是線程,也就是說線程是共享了進(jìn)程的上下文環(huán)境。

區(qū)別:

1) 一個程序至少有一個進(jìn)程,一個進(jìn)程至少有一個線程.

2) 線程的劃分尺度小于進(jìn)程,可以看成是進(jìn)程的一部分。

3) 另外,進(jìn)程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率。

4) 線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的。每個獨立的進(jìn)程有一個程序運行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制。

5) 從邏輯角度來看,多線程的意義在于一個應(yīng)用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但操作系統(tǒng)并沒有將多個線程看做多個獨立的應(yīng)用,來實現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。

 

6.Java中什么是線程調(diào)度?

一般來說,計算機通常只有一個CPU,在任意時刻只能執(zhí)行一條機器指令,每個線程只有獲得CPU的使用權(quán)才能執(zhí)行指令.所謂多線程的并發(fā)運行,其實是指從宏觀上看,各個線程輪流獲得CPU的使用權(quán),分別執(zhí)行各自的任務(wù).在運行池中,會有多個處于就緒狀態(tài)的線程在等待CPU,JAVA虛擬機的一項任務(wù)就是負(fù)責(zé)線程的調(diào)度,線程調(diào)度是指按照特定機制為多個線程分配CPU的使用權(quán).

 

7.在線程中你怎么處理不可捕捉異常?

先說一下怎么出現(xiàn)的:異常在線程中是不能共享的,main函數(shù)也是一個線程名稱叫做主線程,它與線程池里面的線程是相互獨立的,就是說你發(fā)現(xiàn)一個線程報錯了,這個報錯信息是由子線程報出。但是這個線程跟主線程無關(guān),并沒有拋出異常到主線程上去。所以主線程的捕獲無法捕獲其他線程的異常,它根本不知道已經(jīng)報了異常。線程運行是互相獨立的,可以理解主線程也是一種普通的線程即可。如果線程之間異常互相干擾,那么1000個線程,一個線程掛了,其它線程跟著遭殃,這是不合理的。

怎么處理如果一定要主線程去 catch 子線程的異常,可以使用

thread.setUncaughtExceptionHandler(new ExceptionHandler());

 

8.如何在Java中實現(xiàn)線程?用Runnable還是Thread?

參見上面第2題,三種創(chuàng)建線程方式的優(yōu)缺點

 

9.Thread 類中的start()  run() 方法有什么區(qū)別?

區(qū)別就是:start() 創(chuàng)建新進(jìn)程 ,run() 沒有

 

10.什么是線程池?為什么要使用它?

線程池是指在初始化一個多線程應(yīng)用程序過程中創(chuàng)建一個線程集合,然后在需要執(zhí)行新的任務(wù)時重用這些線程而不是新建一個線程。線程池中線程的數(shù)量通常完全取決于可用內(nèi)存數(shù)量和應(yīng)用程序的需求。也可以自己設(shè)置線程數(shù)量。線程池中的每個線程都有被分配一個任務(wù),一旦任務(wù)已經(jīng)完成了,線程回到池子中并等待下一次分配任務(wù)。

線程池的結(jié)構(gòu):

1、線程池管理器(ThreadPoolManager:用于創(chuàng)建并管理線程池
2、工作線程(WorkThread: 線程池中線程
3、任務(wù)接口(Task:每個任務(wù)必須實現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行。
4、任務(wù)隊列:用于存放沒有處理的任務(wù)。提供一種緩沖機制

為什么使用:(了解前四個)

1. 改進(jìn)了一個應(yīng)用程序的響應(yīng)時間,應(yīng)用程序可以直接拿來使用而不用新建一個線程。

2. 線程池節(jié)省創(chuàng)建一個完整的線程的開銷并可以在任務(wù)完成后回收資源。

3. 線程池根據(jù)當(dāng)前在系統(tǒng)中運行的進(jìn)程來優(yōu)化線程時間片。

4. 線程池允許我們開啟多個任務(wù)而不用為每個線程設(shè)置屬性。

5. 線程池允許我們?yōu)檎趫?zhí)行的任務(wù)的程序參數(shù)傳遞一個包含狀態(tài)信息的對象引用。

6. 線程池可以用來解決處理一個特定請求最大線程數(shù)量限制問題。

  • 上一篇文章:

  • 下一篇文章: 沒有了
  •  

    0791-87557233

    重視每個來電 珍惜您的時間
    思誠者開發(fā)沙龍
    江西思誠科技有限公司  贛ICP備17006097號  CopyRight©2014 - 2020