runnable和thread的區(qū)別(多線程必須用Runable)
“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個(gè)不僅審美在線,而且實(shí)用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對(duì)成都做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)站制作、網(wǎng)站開(kāi)發(fā)、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無(wú)止境。
Java中有兩種實(shí)現(xiàn)多線程的方式以及兩種方式之間的區(qū)別
看到一個(gè)面試題.問(wèn)兩種實(shí)現(xiàn)多線程的方法.沒(méi)事去網(wǎng)上找了找答案.
網(wǎng)上流傳很廣的是一個(gè)網(wǎng)上售票系統(tǒng)講解.轉(zhuǎn)發(fā)過(guò)來(lái).已經(jīng)不知道原文到底是出自哪里了.
Java中有兩種實(shí)現(xiàn)多線程的方式。一是直接繼承Thread類,二是實(shí)現(xiàn)Runnable接口。那么這兩種實(shí)現(xiàn)多線程的方式在應(yīng)用上有什么區(qū)別呢?
為了回答這個(gè)問(wèn)題,我們可以通過(guò)編寫(xiě)一段代碼來(lái)進(jìn)行分析。我們用代碼來(lái)模擬鐵路售票系統(tǒng),實(shí)現(xiàn)通過(guò)四個(gè)售票點(diǎn)發(fā)售某日某次列車(chē)的100張車(chē)票,一個(gè)售票點(diǎn)用一個(gè)線程表示。
首先這樣編寫(xiě)這個(gè)程序:
Java代碼
class ThreadTest extends Thread{
private int ticket = 100;
public void run(){
while(true){
if(ticket 0){
System.out.println(Thread.currentThread().getName() +
"is saling ticket" + ticket--);
}else{
break;
}
}
}
}
源碼打???
class ThreadTest extends Thread{
private int ticket = 100;
public void run(){
while(true){
if(ticket 0){
System.out.println(Thread.currentThread().getName() +
"is saling ticket" + ticket--);
}else{
break;
}
}
}
}
main測(cè)試類:
Java代碼
public class ThreadDome1{
public static void main(String[] args){
ThreadTest t = new ThreadTest();
t.start();
t.start();
t.start();
t.start();
}
}
源碼打印?
public class ThreadDome1{
public static void main(String[] args){
ThreadTest t = new ThreadTest();
t.start();
t.start();
t.start();
t.start();
}
}
上面的代碼中,我們用ThreadTest類模擬售票處的售票過(guò)程,run方法中的每一次循環(huán)都將總票數(shù)減1,模擬賣(mài)出一張車(chē)票,同時(shí)該車(chē)票號(hào)打印出來(lái),直接剩余的票數(shù)到零為止。在ThreadDemo1類的main方法中,我們創(chuàng)建了一個(gè)線程對(duì)象,并重復(fù)啟動(dòng)四次,希望通過(guò)這種方式產(chǎn)生四個(gè)線程。從運(yùn)行的結(jié)果來(lái)看我們發(fā)現(xiàn)其實(shí)只有一個(gè)線程在運(yùn)行,這個(gè)結(jié)果 告訴我們:一個(gè)線程對(duì)象只能啟動(dòng)一個(gè)線程,無(wú)論你調(diào)用多少遍start()方法,結(jié)果只有一個(gè)線程。
我們接著修改ThreadDemo1,在main方法中創(chuàng)建四個(gè)Thread對(duì)象:
Java代碼
public class ThreadDemo1{
public static void main(String[] args){
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
}
}
源碼打?。?/p>
public class ThreadDemo1{
public static void main(String[] args){
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
}
}
Java代碼
class ThreadTest extends Thread{
private int ticket = 100;
public void run(){
while(true){
if(ticket 0){
System.out.println(Thread.currentThread().getName() +
" is saling ticket" + ticket--);
}else{
break;
}
}
}
}
源碼打???
class ThreadTest extends Thread{
private int ticket = 100;
public void run(){
while(true){
if(ticket 0){
System.out.println(Thread.currentThread().getName() +
" is saling ticket" + ticket--);
}else{
break;
}
}
}
}
這下達(dá)到目的了嗎?
從結(jié)果上看每個(gè)票號(hào)都被打印了四次,即 四個(gè)線程各自賣(mài)各自的100張票,而不去賣(mài)共同的100張票。這種情況是怎么造成的呢?我們需要的是,多個(gè)線程去處理同一個(gè)資源,一個(gè)資源只能對(duì)應(yīng)一個(gè)對(duì)象,在上面的程序中,我們創(chuàng)建了四個(gè)ThreadTest對(duì)象,就等于創(chuàng)建了四個(gè)資源,每個(gè)資源都有100張票,每個(gè)線程都在獨(dú)自處理各自的資源。
經(jīng)過(guò)這些實(shí)驗(yàn)和分析,可以總結(jié)出,要實(shí)現(xiàn)這個(gè)鐵路售票程序,我們只能創(chuàng)建一個(gè)資源對(duì)象,但要?jiǎng)?chuàng)建多個(gè)線程去處理同一個(gè)資源對(duì)象,并且每個(gè)線程上所運(yùn)行的是相同的程序代碼。在回顧一下使用接口編寫(xiě)多線程的過(guò)程。
Java代碼
public class ThreadDemo1{
public static void main(String[] args){
ThreadTest t = new ThreadTest();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
源碼打?。?/p>
public class ThreadDemo1{
public static void main(String[] args){
ThreadTest t = new ThreadTest();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
Java代碼
class ThreadTest implements Runnable{
private int tickets = 100;
public void run(){
while(true){
if(tickets 0){
System.out.println(Thread.currentThread().getName() +
" is saling ticket " + tickets--);
}
}
}
}
源碼打???
class ThreadTest implements Runnable{
private int tickets = 100;
public void run(){
while(true){
if(tickets 0){
System.out.println(Thread.currentThread().getName() +
" is saling ticket " + tickets--);
}
}
}
}
上面的程序中,創(chuàng)建了四個(gè)線程, 每個(gè)線程調(diào)用的是同一個(gè)ThreadTest對(duì)象中的run()方法,訪問(wèn)的是同一個(gè)對(duì)象中的變量(tickets)的實(shí)例,這個(gè)程序滿足了我們的需求。在Windows上可以啟動(dòng)多個(gè)記事本程序一樣,也就是多個(gè)進(jìn)程使用同一個(gè)記事本程序代碼。
可見(jiàn), 實(shí)現(xiàn)Runnable接口相對(duì)于繼承Thread類來(lái)說(shuō),有如下顯著的好處:
(1)適合多個(gè)相同程序代碼的線程去處理同一資源的情況,把虛擬CPU(線程)同程序的代碼,數(shù)據(jù)有效的分離,較好地體現(xiàn)了面向?qū)ο蟮脑O(shè)計(jì)思想。
(2)可以避免由于Java的單繼承特性帶來(lái)的局限。我們經(jīng)常碰到這樣一種情況,即當(dāng)我們要將已經(jīng)繼承了某一個(gè)類的子類放入多線程中,由于一個(gè)類不能同時(shí)有兩個(gè)父類,所以不能用繼承Thread類的方式,那么,這個(gè)類就只能采用實(shí)現(xiàn)Runnable接口的方式了。
(3)有利于程序的健壯性,代碼能夠被多個(gè)線程共享,代碼與數(shù)據(jù)是獨(dú)立的。當(dāng)多個(gè)線程的執(zhí)行代碼來(lái)自同一個(gè)類的實(shí)例時(shí),即稱它們共享相同的代碼。多個(gè)線程操作相同的數(shù)據(jù),與它們的代碼無(wú)關(guān)。當(dāng)共享訪問(wèn)相同的對(duì)象是,即它們共享相同的數(shù)據(jù)。當(dāng)線程被構(gòu)造時(shí),需要的代碼和數(shù)據(jù)通過(guò)一個(gè)對(duì)象作為構(gòu)造函數(shù)實(shí)參傳遞進(jìn)去,這個(gè)對(duì)象就是一個(gè)實(shí)現(xiàn)了Runnable接口的類的實(shí)例。
隨著互聯(lián)網(wǎng)的不斷發(fā)展,java開(kāi)發(fā)成為了眾多開(kāi)發(fā)工程師使用的主流編程開(kāi)發(fā)語(yǔ)言。
今天,java課程培訓(xùn)機(jī)構(gòu)就一起來(lái)了解一下,在java程序員面試過(guò)程中,有哪些比較常見(jiàn)的技術(shù)面試問(wèn)題需要我們了解。
1、什么是線程?線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的小單位,它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。
程序員可以通過(guò)它進(jìn)行多處理器編程,你可以使用多線程對(duì)運(yùn)算密集型任務(wù)提速。
比如,如果一個(gè)線程完成一個(gè)任務(wù)要100毫秒,那么用十個(gè)線程完成改任務(wù)只需10毫秒。
2、線程和進(jìn)程有什么區(qū)別?線程是進(jìn)程的子集,一個(gè)進(jìn)程可以有很多線程,每條線程并行執(zhí)行不同的任務(wù)。
不同的進(jìn)程使用不同的內(nèi)存空間,而所有的線程共享一片相同的內(nèi)存空間。
每個(gè)線程都擁有單獨(dú)的棧內(nèi)存用來(lái)存儲(chǔ)本地?cái)?shù)據(jù)。
3、如何在Java中實(shí)現(xiàn)線程?兩種方式:java.lang.Thread類的實(shí)例就是一個(gè)線程但是它需要調(diào)用java.lang.Runnable接口來(lái)執(zhí)行,由于線程類本身就是調(diào)用的Runnable接口所以你可以繼承java.lang.Thread類或者直接調(diào)用Runnable接口來(lái)重寫(xiě)run()方法實(shí)現(xiàn)線程。
4、有哪些不同的線程生命周期?當(dāng)我們?cè)贘ava程序中新建一個(gè)線程時(shí),它的狀態(tài)是New。
當(dāng)我們調(diào)用線程的start()方法時(shí),狀態(tài)被改變?yōu)镽unnable。
線程調(diào)度器會(huì)為Runnable線程池中的線程分配CPU時(shí)間并且講它們的狀態(tài)改變?yōu)镽unning。
其他的線程狀態(tài)還有Waiting,Blocked和Dead。
5、你對(duì)線程優(yōu)先級(jí)的理解是什么?每一個(gè)線程都是有優(yōu)先級(jí)的,一般來(lái)說(shuō),高優(yōu)先級(jí)的線程在運(yùn)行時(shí)會(huì)具有優(yōu)先權(quán),但這依賴于線程調(diào)度的實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)是和操作系統(tǒng)相關(guān)的(OSdependent)。
我們可以定義線程的優(yōu)先級(jí),但是這并不能保證高優(yōu)先級(jí)的線程會(huì)在低優(yōu)先級(jí)的線程前執(zhí)行。
線程優(yōu)先級(jí)是一個(gè)int變量(從1-10),1代表低優(yōu)先級(jí),10代表高優(yōu)先級(jí)。
6、什么是死鎖(Deadlock)?如何分析和避免死鎖?死鎖是指兩個(gè)以上的線程永遠(yuǎn)阻塞的情況,這種情況產(chǎn)生至少需要兩個(gè)以上的線程和兩個(gè)以上的資源。
分析死鎖,我們需要查看Java應(yīng)用程序的線程轉(zhuǎn)儲(chǔ)。
我們需要找出那些狀態(tài)為BLOCKED的線程和他們等待的資源。
每個(gè)資源都有一個(gè)唯一的id,用這個(gè)id我們可以找出哪些線程已經(jīng)擁有了它的對(duì)象鎖。
先建一個(gè)用于下載文件的多線程類,通常要指明下載文件的位置(URL)和文件名以及保存到本地的路徑
public class FileDownloader implements Runnable
{
private static File file;//要下載的文件
private static String url;//文件所在URL
private static File storagePath;//保存路徑
public static void initialize(File file, String url, File storagePath)//初始化靜態(tài)字段,初始化的代碼不用我寫(xiě)吧
}
然后,指明同步塊,目的是讓各個(gè)線程共享一個(gè)文件資源,那樣它們可以知道同一個(gè)文件的下載狀況(即獲取其他線程下載文件到哪個(gè)位置,以防重復(fù)下載)
public synchronized void fileDownload()//此方法用于下載文件,一般的Java程序員都會(huì)寫(xiě),實(shí)在不會(huì)我可以幫你補(bǔ)上
或者
public void fileDownload(){
synchronized(file){
synchronized(url){
synchronized(storagePath){
}}}}//給每個(gè)字段加上同步塊
run()方法的實(shí)現(xiàn)就以自己的喜好去寫(xiě)吧,只要里面調(diào)用了fileDownload()方法就行。
public void run(){
…
fileDownload();//下載文件
…
}
然后,在主類的main方法中創(chuàng)建一個(gè)多線程數(shù)組:
Runnable[] fds=new FileDownloader[線程數(shù)量];//fds為file_downloaders縮寫(xiě)
Thread[] threads=new Thread[線程數(shù)量];
最后使用循環(huán)把所有的線程逐一啟動(dòng)。
for(int i=0;i線程數(shù)量;i++){
threads[i]=new Thread(fds[i]);
threads[i].start();
}
public?class?Test{
public?static?Object?obj?=?new?Object();
public?static?void?main(String[]?args){
new?A().start();
new?B().start();
}
}
class?A?extends?Thread{
public?void?run(){
try{
synchronized(Test.obj){
for(int?i?=?1?;?i??31;i?+=?6){
Test.obj.notify();
System.out.println("線程A:"+?i);
System.out.println("線程A:"+?(i+1));
System.out.println("線程A:"+?(i+2));
Test.obj.wait();
}
}
}catch(Exception?e){
e.printStackTrace();
}
}
}
class?B?extends?Thread{
public?void?run(){
try{
synchronized(Test.obj){
for(int?i?=?4?;?i??31;i?+=?6){
Test.obj.notify();
System.out.println("線程B:"+?i);
System.out.println("線程B:"+?(i+1));
System.out.println("線程B:"+?(i+2));
Test.obj.wait();
}
}
}catch(Exception?e){
e.printStackTrace();
}
}
}
一般面試官都會(huì)讓面試者回答哪些Java基礎(chǔ)面試題啊?難不難啊? 針對(duì)這一系列的疑問(wèn),廣州增城Java培訓(xùn)學(xué)校收集了部分Java基礎(chǔ)面試題與大家分享,希望對(duì)各位參加了廣州專業(yè)Java培訓(xùn)的學(xué)生,有一定的幫助! 一、Java基礎(chǔ)知識(shí) 1.Java有那些基本數(shù)據(jù)類型,String是不是基本數(shù)據(jù)類型,他們有何區(qū)別。 2.字符串的操作: 寫(xiě)一個(gè)方法,實(shí)現(xiàn)字符串的反轉(zhuǎn),如:輸入abc,輸出cba 寫(xiě)一個(gè)方法,實(shí)現(xiàn)字符串的替換,如:輸入bbbwlirbbb,輸出bbbhhtccc。 3.數(shù)據(jù)類型之間的轉(zhuǎn)換 如何將數(shù)值型字符轉(zhuǎn)換為數(shù)字(Integer,Double) 如何將數(shù)字轉(zhuǎn)換為字符 如何取小數(shù)點(diǎn)前兩位,并四舍五入。 4.日期和時(shí)間 如何取得年月日,小時(shí)分秒 如何取得從1970年到現(xiàn)在的毫秒數(shù) 如何獲取某個(gè)日期是當(dāng)月的最后一天 如何格式化日期 5.數(shù)組和集合 6.文件和目錄(I/O)操作 如何列出某個(gè)目錄下的所有文件 如何列出某個(gè)目錄下的所有子目錄 判斷一個(gè)文件或目錄是否存在 如何讀寫(xiě)文件 7.Java多態(tài)的實(shí)現(xiàn)(繼承、重載、覆蓋) 8.編碼轉(zhuǎn)換,怎樣實(shí)現(xiàn)將GB2312編碼的字符串轉(zhuǎn)換為ISO-8859-1編碼的字符串。 9.Java中訪問(wèn)數(shù)據(jù)庫(kù)的步驟,Statement和PreparedStatement之間的區(qū)別。 10.找出下列代碼可能存在的錯(cuò)誤,并說(shuō)明原因: 二、JSPServlet技術(shù) 1.描述JSP和Servlet的區(qū)別、共同點(diǎn)、各自應(yīng)用的范圍 2.在Web開(kāi)發(fā)中需要處理HTML標(biāo)記時(shí),應(yīng)做什么樣的處理,要篩選那些字符( “”) 3.在JSP中如何讀取客戶端的請(qǐng)求,如何訪問(wèn)CGI變量,如何確定某個(gè)Jsp文件的真實(shí)路徑。 4.描述Cookie和Session的作用,區(qū)別和各自的應(yīng)用范圍,Session工作原理。 5.列出Jsp中包含外部文件的方式,兩者有何區(qū)別。 6.說(shuō)明Jsp中errorPage的作用,應(yīng)用范圍。 7.介紹在Jsp中如何使用JavaBeans。 8.簡(jiǎn)單介紹JSP的標(biāo)記庫(kù) 9.Jsp和Servlet中的請(qǐng)求轉(zhuǎn)發(fā)分別如何實(shí)現(xiàn)。 三、J2EE相關(guān)知識(shí) 1.介紹J2EE、J2SE、J2SE的區(qū)別。 2.J2EE是一種技術(shù)還是一種平臺(tái),他提供了那些技術(shù)。 3.什么是Application Server,它有什么功能和優(yōu)點(diǎn)。 4.簡(jiǎn)單介紹連接池的優(yōu)點(diǎn)和原理。 5.Web.xml的作用 四、其他 1.Web安全性的考慮(表單驗(yàn)證、瀏覽器Basic方式的驗(yàn)證,應(yīng)用程序的安全性,SSL,代碼考慮) 2.簡(jiǎn)單介紹您所了解的MVC。 3.簡(jiǎn)單介紹所了解的XML。 4.文檔和編碼規(guī)范 5.Java中的分頁(yè)、效率考慮。 6.簡(jiǎn)單介紹您所了解的structs。 Java面試題收藏: 1.xml在項(xiàng)目中的作用 2.s-EJB 與 e-EJB的區(qū)別 3.會(huì)話面的作用 4.cmp與bmp的優(yōu)缺點(diǎn) 5.j2me程序的必需的幾個(gè)部分 6.c/s與b/s的區(qū)別 7.構(gòu)建一個(gè)connect pool然后再調(diào)用它, 8.j2ee平臺(tái)與dotnet平臺(tái)的區(qū)別 9.ejb的life cycle 10.session bean 和 entity bean的區(qū)別 11.ejb中的transaction機(jī)制 12.synchronized (生產(chǎn)者和消費(fèi)) 13.String 和 StringBuffer 14.Serializable 15.MVC (Struts的工作流程) 16.什么是MDA 17.tcp與udp的區(qū)別 18.鏈表與散列表和數(shù)組的區(qū)別 19.堆和棧的區(qū)別 20.ejb的分類及區(qū)別 21.你對(duì)現(xiàn)在軟件業(yè)以及國(guó)內(nèi)軟件業(yè)的看法 22.談?wù)刯ava多線程 23.談?wù)勎募用芗夹g(shù) 24.軟件開(kāi)發(fā)生命周期 25.路由協(xié)議種類及特點(diǎn) 26.java的awt和swing組件的GUI設(shè)計(jì)的關(guān)鍵 27.對(duì)于java流的認(rèn)識(shí) 28.簡(jiǎn)單描述一下awt與swing區(qū)別。 29.簡(jiǎn)述java編程中事件處理模式。 30.你編寫(xiě)過(guò)applet嗎?applet的安全權(quán)限如何?試列舉java application或者applet中與servlet/jsp通信可以采用的方式。 31.簡(jiǎn)述邏輯操作(如|)與條件操作(如||)的區(qū)別。
面試 的目的是確定面試者如何處理他們所選擇的研究領(lǐng)域的問(wèn)題,以及他們?nèi)绾闻行缘厮伎紗?wèn)題。下面我給大家?guī)?lái)2021面試網(wǎng)絡(luò)工程師的題目參考,希望能幫助到大家!
Java多線程 面試題 目
1、什么是線程?
線程是 操作系統(tǒng) 能夠進(jìn)行運(yùn)算調(diào)度的最小單位,它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。程序員可以通過(guò)它進(jìn)行多處理器編程,你可以使用多線程對(duì)運(yùn)算密集型任務(wù)提速。比如,如果一個(gè)線程完成一個(gè)任務(wù)要100毫秒,那么用十個(gè)線程完成改任務(wù)只需10毫秒。
2、線程和進(jìn)程有什么區(qū)別?
線程是進(jìn)程的子集,一個(gè)進(jìn)程可以有很多線程,每條線程并行執(zhí)行不同的任務(wù)。不同的進(jìn)程使用不同的內(nèi)存空間,而所有的線程共享一片相同的內(nèi)存空間。每個(gè)線程都擁有單獨(dú)的棧內(nèi)存用來(lái)存儲(chǔ)本地?cái)?shù)據(jù)。
3、如何在Java中實(shí)現(xiàn)線程?
兩種方式:java.lang.Thread 類的實(shí)例就是一個(gè)線程但是它需要調(diào)用java.lang.Runnable接口來(lái)執(zhí)行,由于線程類本身就是調(diào)用的Runnable接口所以你可以繼承java.lang.Thread 類或者直接調(diào)用Runnable接口來(lái)重寫(xiě)run() 方法 實(shí)現(xiàn)線程。
4、Java 關(guān)鍵字volatile 與 synchronized 作用與區(qū)別?
Volatile:
它所修飾的變量不保留拷貝,直接訪問(wèn)主內(nèi)存中的。
在Java內(nèi)存模型中,有main memory,每個(gè)線程也有自己的memory (例如寄存器)。為了性能,一個(gè)線程會(huì)在自己的memory中保持要訪問(wèn)的變量的副本。這樣就會(huì)出現(xiàn)同一個(gè)變量在某個(gè)瞬間,在一個(gè)線程的memory中的值可能與另外一個(gè)線程memory中的值,或者main memory中的值不一致的情況。 一個(gè)變量聲明為volatile,就意味著這個(gè)變量是隨時(shí)會(huì)被其他線程修改的,因此不能將它c(diǎn)ache在線程memory中。
synchronized:
當(dāng)它用來(lái)修飾一個(gè)方法或者一個(gè)代碼塊的時(shí)候,能夠保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼。
一、當(dāng)兩個(gè)并發(fā)線程訪問(wèn)同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。
二、然而,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問(wèn)該object中的非synchronized(this)同步代碼塊。
三、尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線程對(duì)object中所有 其它 synchronized(this)同步代碼塊的訪問(wèn)將被阻塞。
四、當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),它就獲得了這個(gè)object的對(duì)象鎖。結(jié)果,其它線程對(duì)該object對(duì)象所有同步代碼部分的訪問(wèn)都被暫時(shí)阻塞。
五、以上規(guī)則對(duì)其它對(duì)象鎖同樣適用。
5、有哪些不同的線程生命周期?
當(dāng)我們?cè)贘ava程序中新建一個(gè)線程時(shí),它的狀態(tài)是New。當(dāng)我們調(diào)用線程的start()方法時(shí),狀態(tài)被改變?yōu)镽unnable。線程調(diào)度器會(huì)為Runnable線程池中的線程分配CPU時(shí)間并且講它們的狀態(tài)改變?yōu)镽unning。其他的線程狀態(tài)還有Waiting,Blocked 和Dead。
6、你對(duì)線程優(yōu)先級(jí)的理解是什么?
每一個(gè)線程都是有優(yōu)先級(jí)的,一般來(lái)說(shuō),高優(yōu)先級(jí)的線程在運(yùn)行時(shí)會(huì)具有優(yōu)先權(quán),但這依賴于線程調(diào)度的實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)是和操作系統(tǒng)相關(guān)的(OS dependent)。
我們可以定義線程的優(yōu)先級(jí),但是這并不能保證高優(yōu)先級(jí)的線程會(huì)在低優(yōu)先級(jí)的線程前執(zhí)行。線程優(yōu)先級(jí)是一個(gè)int變量(從1-10),1代表最低優(yōu)先級(jí),10代表最高優(yōu)先級(jí)。
7、什么是死鎖(Deadlock)?如何分析和避免死鎖?
死鎖是指兩個(gè)以上的線程永遠(yuǎn)阻塞的情況,這種情況產(chǎn)生至少需要兩個(gè)以上的線程和兩個(gè)以上的資源。
分析死鎖,我們需要查看Java應(yīng)用程序的線程轉(zhuǎn)儲(chǔ)。我們需要找出那些狀態(tài)為BLOCKED的線程和他們等待的資源。每個(gè)資源都有一個(gè)唯一的id,用這個(gè)id我們可以找出哪些線程已經(jīng)擁有了它的對(duì)象鎖。
避免嵌套鎖,只在需要的地方使用鎖和避免無(wú)限期等待是避免死鎖的通常辦法。
8、什么是線程安全?Vector是一個(gè)線程安全類嗎?
如果你的代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼。如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的。
一個(gè)線程安全的計(jì)數(shù)器類的同一個(gè)實(shí)例對(duì)象在被多個(gè)線程使用的情況下也不會(huì)出現(xiàn)計(jì)算失誤。很顯然你可以將集合類分成兩組,線程安全和非線程安全的。Vector 是用同步方法來(lái)實(shí)現(xiàn)線程安全的, 而和它相似的ArrayList不是線程安全的。
9、Java中如何停止一個(gè)線程?
Java提供了很豐富的API但沒(méi)有為停止線程提供API。JDK 1.0本來(lái)有一些像stop(), suspend()和resume()的控制方法但是由于潛在的死鎖威脅因此在后續(xù)的JDK版本中他們被棄用了,之后Java API的設(shè)計(jì)者就沒(méi)有提供一個(gè)兼容且線程安全的方法來(lái)停止一個(gè)線程。
當(dāng)run()或者 call()方法執(zhí)行完的時(shí)候線程會(huì)自動(dòng)結(jié)束,如果要手動(dòng)結(jié)束一個(gè)線程,你可以用volatile 布爾變量來(lái)退出run()方法的循環(huán)或者是取消任務(wù)來(lái)中斷線程。
10、什么是ThreadLocal?
ThreadLocal用于創(chuàng)建線程的本地變量,我們知道一個(gè)對(duì)象的所有線程會(huì)共享它的全局變量,所以這些變量不是線程安全的,我們可以使用同步技術(shù)。但是當(dāng)我們不想使用同步的時(shí)候,我們可以選擇ThreadLocal變量。
每個(gè)線程都會(huì)擁有他們自己的Thread變量,它們可以使用get()set()方法去獲取他們的默認(rèn)值或者在線程內(nèi)部改變他們的值。ThreadLocal實(shí)例通常是希望它們同線程狀態(tài)關(guān)聯(lián)起來(lái)是private static屬性。
Kubernetes面試題匯總
1、什么是Kubernetes?
Kubernetes是一個(gè)開(kāi)源容器管理工具,負(fù)責(zé)容器部署,容器擴(kuò)縮容以及負(fù)載平衡。作為Google的創(chuàng)意之作,它提供了出色的社區(qū),并與所有云提供商合作。因此,我們可以說(shuō)Kubernetes不是一個(gè)容器化平臺(tái),而是一個(gè)多容器管理解決方案。
2、Kubernetes與Docker有什么關(guān)系?
眾所周知,Docker提供容器的生命周期管理,Docker鏡像構(gòu)建運(yùn)行時(shí)容器。但是,由于這些單獨(dú)的容器必須通信,因此使用Kubernetes。因此,我們說(shuō)Docker構(gòu)建容器,這些容器通過(guò)Kubernetes相互通信。因此,可以使用Kubernetes手動(dòng)關(guān)聯(lián)和編排在多個(gè)主機(jī)上運(yùn)行的容器。
3、什么是Container Orchestration?
考慮一個(gè)應(yīng)用程序有5-6個(gè)微服務(wù)的場(chǎng)景?,F(xiàn)在,這些微服務(wù)被放在單獨(dú)的容器中,但如果沒(méi)有容器編排就無(wú)法進(jìn)行通信。因此,由于編排意味著所有樂(lè)器在音樂(lè)中和諧共處,所以類似的容器編排意味著各個(gè)容器中的所有服務(wù)協(xié)同工作以滿足單個(gè)服務(wù)器的需求。
4、Kubernetes如何簡(jiǎn)化容器化部署?
由于典型應(yīng)用程序?qū)⒕哂锌缍鄠€(gè)主機(jī)運(yùn)行的容器集群,因此所有這些容器都需要相互通信。因此,要做到這一點(diǎn),你需要一些能夠負(fù)載平衡,擴(kuò)展和監(jiān)控容器的東西。由于Kubernetes與云無(wú)關(guān)并且可以在任何公共/私有提供商上運(yùn)行,因此必須是您簡(jiǎn)化容器化部署的選擇。
5、您對(duì)Kubernetes的集群了解多少?
Kubernetes背后的基礎(chǔ)是我們可以實(shí)施所需的狀態(tài)管理,我的意思是我們可以提供特定配置的集群服務(wù),并且集群服務(wù)將在基礎(chǔ)架構(gòu)中運(yùn)行并運(yùn)行該配置。
因此,正如您所看到的,部署文件將具有提供給集群服務(wù)所需的所有配置?,F(xiàn)在,部署文件將被提供給API,然后由集群服務(wù)決定如何在環(huán)境中安排這些pod,并確保正確運(yùn)行的pod數(shù)量。
因此,位于服務(wù)前面的API,工作節(jié)點(diǎn)和節(jié)點(diǎn)運(yùn)行的Kubelet進(jìn)程,共同構(gòu)成了Kubernetes集群。
6、Kubernetes Architecture的不同組件有哪些?
Kubernetes Architecture主要有兩個(gè)組件 - 主節(jié)點(diǎn)和工作節(jié)點(diǎn)。如下圖所示,master和worker節(jié)點(diǎn)中包含許多內(nèi)置組件。主節(jié)點(diǎn)具有kube-controller-manager,kube-apiserver,kube-scheduler等。而工作節(jié)點(diǎn)具有在每個(gè)節(jié)點(diǎn)上運(yùn)行的kubelet和kube-proxy。
7、您能否介紹一下Kubernetes中主節(jié)點(diǎn)的工作情況?
Kubernetes master控制容器存在的節(jié)點(diǎn)和節(jié)點(diǎn)內(nèi)部?,F(xiàn)在,這些單獨(dú)的容器包含在容器內(nèi)部和每個(gè)容器內(nèi)部,您可以根據(jù)配置和要求擁有不同數(shù)量的容器。
因此,如果必須部署pod,則可以使用用戶界面或命令行界面部署它們。然后,在節(jié)點(diǎn)上調(diào)度這些pod,并根據(jù)資源需求,將pod分配給這些節(jié)點(diǎn)。kube-apiserver確保在Kubernetes節(jié)點(diǎn)和主組件之間建立通信。
8、kube-apiserver和kube-scheduler的作用是什么?
kube -apiserver遵循橫向擴(kuò)展架構(gòu),是主節(jié)點(diǎn)控制面板的前端。這將公開(kāi)Kubernetes主節(jié)點(diǎn)組件的所有API,并負(fù)責(zé)在Kubernetes節(jié)點(diǎn)和Kubernetes主組件之間建立通信。
kube-scheduler負(fù)責(zé)工作節(jié)點(diǎn)上工作負(fù)載的分配和管理。因此,它根據(jù)資源需求選擇最合適的節(jié)點(diǎn)來(lái)運(yùn)行未調(diào)度的pod,并跟蹤資源利用率。它確保不在已滿的節(jié)點(diǎn)上調(diào)度工作負(fù)載。
9、你對(duì)Kubernetes的負(fù)載均衡器有什么了解?
負(fù)載均衡器是暴露服務(wù)的最常見(jiàn)和標(biāo)準(zhǔn)方式之一。根據(jù)工作環(huán)境使用兩種類型的負(fù)載均衡器,即內(nèi)部負(fù)載均衡器或外部負(fù)載均衡器。內(nèi)部負(fù)載均衡器自動(dòng)平衡負(fù)載并使用所需配置分配容器,而外部負(fù)載均衡器將流量從外部負(fù)載引導(dǎo)至后端容器。
10、Replica Set 和 Replication Controller之間有什么區(qū)別?
Replica Set 和 Replication Controller幾乎完全相同。它們都確保在任何給定時(shí)間運(yùn)行指定數(shù)量的pod副本。不同之處在于復(fù)制pod使用的選擇器。Replica Set使用基于集合的選擇器,而Replication Controller使用基于權(quán)限的選擇器。
Equity-Based選擇器:這種類型的選擇器允許按標(biāo)簽鍵和值進(jìn)行過(guò)濾。因此,在外行術(shù)語(yǔ)中,基于Equity的選擇器將僅查找與標(biāo)簽具有完全相同 短語(yǔ) 的pod。
示例:假設(shè)您的標(biāo)簽鍵表示app = nginx,那么,使用此選擇器,您只能查找標(biāo)簽應(yīng)用程序等于nginx的那些pod。
Selector-Based選擇器:此類型的選擇器允許根據(jù)一組值過(guò)濾鍵。因此,換句話說(shuō),基于Selector的選擇器將查找已在集合中提及其標(biāo)簽的pod。
示例:假設(shè)您的標(biāo)簽鍵在(nginx,NPS,Apache)中顯示應(yīng)用程序。然后,使用此選擇器,如果您的應(yīng)用程序等于任何nginx,NPS或Apache,則選擇器將其視為真實(shí)結(jié)果。
滲透攻擊的測(cè)試步驟
1.如果原始值為2,我們使用(1+1)或(3-1),程序作出相同回應(yīng),表明易受攻擊
2.如果單引號(hào)被過(guò)濾掉,我們可以用ASCII命令,使它返回字符的數(shù)字化代碼,如51-ASCII(1)
3.在URL編碼中,和=用于鏈接名稱/值對(duì),建立查詢字符串應(yīng)當(dāng)分別使用%26和%3d進(jìn)行編碼
4.如查詢字符串不允許使用空格,使用+或%20編碼
5.分號(hào)被用于分割cookie自讀,使用%3d編碼
2021面試網(wǎng)絡(luò)工程師的題目相關(guān) 文章 :
★ 關(guān)于網(wǎng)絡(luò)工程師的面試題有哪些
★ 網(wǎng)絡(luò)管理員面試題及答案大全
★ 最新的運(yùn)維工程師面試題目整理
★ 網(wǎng)絡(luò)測(cè)試工程師面試題及答案
★ 計(jì)算機(jī)網(wǎng)絡(luò)面試題及參考答案
★ 網(wǎng)絡(luò)工程師面試自我介紹范文五篇
★ 面試網(wǎng)絡(luò)技術(shù)工程師的有哪些提問(wèn)
★ 最新的it運(yùn)維工程師面試題整理