Ⅰ java 如何停止一個死循環
java 停止一個死循環,可以使用break關鍵字,跳出循環,如下代碼:
packagecom.qiu.lin.he;
publicclassCeshi{
publicstaticvoidmain(String[]args){
for(inti=2;i>0;i++){
if(i==80){
System.out.println("死循環退出了");
break;
}
}
}
}
運行結果如下:
Ⅱ java多線程問題 跳過run方法裡面的if執行
多線程
35. 並行和並發有什麼區別?
並行是指兩個或者多個事件在同一時刻發生;而並發是指兩個或多個事件在同一時間間隔發生。
並行是在不同實體上的多個事件,並發是在同一實體上的多個事件。
在一台處理器上「同時」處理多個任務,在多台處理器上同時處理多個任務。如hadoop分布式集群。
所以並發編程的目標是充分的利用處理器的每一個核,以達到最高的處理性能。
36. 線程和進程的區別?
簡而言之,進程是程序運行和資源分配的基本單位,一個程序至少有一個進程,一個進程至少有一個線程。進程在執行過程中擁有獨立的內存單元,而多個線程共享內存資源,減少切換次數,從而效率更高。線程是進程的一個實體,是cpu調度和分派的基本單位,是比程序更小的能獨立運行的基本單位。同一進程中的多個線程之間可以並發執行。
37. 守護線程是什麼?
守護線程(即daemon thread),是個服務線程,准確地來說就是服務其他的線程。
38. 創建線程有哪幾種方式?
①. 繼承Thread類創建線程類
定義Thread類的子類,並重寫該類的run方法,該run方法的方法體就代表了線程要完成的任務。因此把run方法稱為執行體。
創建Thread子類的實例,即創建了線程對象。
調用線程對象的start方法來啟動該線程。
②. 通過Runnable介面創建線程類
定義runnable介面的實現類,並重寫該介面的run方法,該run方法的方法體同樣是該線程的線程執行體。
創建 Runnable實現類的實例,並依此實例作為Thread的target來創建Thread對象,該Thread對象才是真正的線程對象。
調用線程對象的start方法來啟動該線程。
③. 通過Callable和Future創建線程
創建Callable介面的實現類,並實現call方法,該call方法將作為線程執行體,並且有返回值。
創建Callable實現類的實例,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call方法的返回值。
使用FutureTask對象作為Thread對象的target創建並啟動新線程。
調用FutureTask對象的get方法來獲得子線程執行結束後的返回值。
39. 說一下 runnable 和 callable 有什麼區別?
有點深的問題了,也看出一個Java程序員學習知識的廣度。
Runnable介面中的run方法的返回值是void,它做的事情只是純粹地去執行run方法中的代碼而已;
Callable介面中的call方法是有返回值的,是一個泛型,和Future、FutureTask配合可以用來獲取非同步執行的結果。
40. 線程有哪些狀態?
線程通常都有五種狀態,創建、就緒、運行、阻塞和死亡。
創建狀態。在生成線程對象,並沒有調用該對象的start方法,這是線程處於創建狀態。
就緒狀態。當調用了線程對象的start方法之後,該線程就進入了就緒狀態,但是此時線程調度程序還沒有把該線程設置為當前線程,此時處於就緒狀態。在線程運行之後,從等待或者睡眠中回來之後,也會處於就緒狀態。
運行狀態。線程調度程序將處於就緒狀態的線程設置為當前線程,此時線程就進入了運行狀態,開始運行run函數當中的代碼。
阻塞狀態。線程正在運行的時候,被暫停,通常是為了等待某個時間的發生(比如說某項資源就緒)之後再繼續運行。sleep,suspend,wait等方法都可以導致線程阻塞。
死亡狀態。如果一個線程的run方法執行結束或者調用stop方法後,該線程就會死亡。對於已經死亡的線程,無法再使用start方法令其進入就緒
41. sleep 和 wait 有什麼區別?
sleep:方法是線程類(Thread)的靜態方法,讓調用線程進入睡眠狀態,讓出執行機會給其他線程,等到休眠時間結束後,線程進入就緒狀態和其他線程一起競爭cpu的執行時間。因為sleep 是static靜態的方法,他不能改變對象的機鎖,當一個synchronized塊中調用了sleep 方法,線程雖然進入休眠,但是對象的機鎖沒有被釋放,其他線程依然無法訪問這個對象。
wait:wait是Object類的方法,當一個線程執行到wait方法時,它就進入到一個和該對象相關的等待池,同時釋放對象的機鎖,使得其他線程能夠訪問,可以通過notify,notifyAll方法來喚醒等待的線程
42. notify和 notifyAll有什麼區別?
如果線程調用了對象的 wait方法,那麼線程便會處於該對象的等待池中,等待池中的線程不會去競爭該對象的鎖。
當有線程調用了對象的 notifyAll方法(喚醒所有 wait 線程)或 notify方法(只隨機喚醒一個 wait 線程),被喚醒的的線程便會進入該對象的鎖池中,鎖池中的線程會去競爭該對象鎖。也就是說,調用了notify後只要一個線程會由等待池進入鎖池,而notifyAll會將該對象等待池內的所有線程移動到鎖池中,等待鎖競爭。
優先順序高的線程競爭到對象鎖的概率大,假若某線程沒有競爭到該對象鎖,它還會留在鎖池中,唯有線程再次調用 wait方法,它才會重新回到等待池中。而競爭到對象鎖的線程則繼續往下執行,直到執行完了 synchronized 代碼塊,它會釋放掉該對象鎖,這時鎖池中的線程會繼續競爭該對象鎖。
43. 線程的 run和 start有什麼區別?
每個線程都是通過某個特定Thread對象所對應的方法run來完成其操作的,方法run稱為線程體。通過調用Thread類的start方法來啟動一個線程。
start方法來啟動一個線程,真正實現了多線程運行。這時無需等待run方法體代碼執行完畢,可以直接繼續執行下面的代碼;這時此線程是處於就緒狀態, 並沒有運行。然後通過此Thread類調用方法run來完成其運行狀態, 這里方法run稱為線程體,它包含了要執行的這個線程的內容, Run方法運行結束, 此線程終止。然後CPU再調度其它線程。
run方法是在本線程里的,只是線程里的一個函數,而不是多線程的。 如果直接調用run,其實就相當於是調用了一個普通函數而已,直接待用run方法必須等待run方法執行完畢才能執行下面的代碼,所以執行路徑還是只有一條,根本就沒有線程的特徵,所以在多線程執行時要使用start方法而不是run方法。
44. 創建線程池有哪幾種方式?
①. newFixedThreadPool(int nThreads)
創建一個固定長度的線程池,每當提交一個任務就創建一個線程,直到達到線程池的最大數量,這時線程規模將不再變化,當線程發生未預期的錯誤而結束時,線程池會補充一個新的線程。
②. newCachedThreadPool
創建一個可緩存的線程池,如果線程池的規模超過了處理需求,將自動回收空閑線程,而當需求增加時,則可以自動添加新線程,線程池的規模不存在任何限制。
③. newSingleThreadExecutor
這是一個單線程的Executor,它創建單個工作線程來執行任務,如果這個線程異常結束,會創建一個新的來替代它;它的特點是能確保依照任務在隊列中的順序來串列執行。
④. newScheledThreadPool(int corePoolSize)
創建了一個固定長度的線程池,而且以延遲或定時的方式來執行任務,類似於Timer。
45. 線程池都有哪些狀態?
線程池有5種狀態:Running、ShutDown、Stop、Tidying、Terminated
Ⅲ java怎麼跳出if語句
return是一定可以的。如果是在循環中,可以使用break,continue。
沒有專門針對if的跳出語句。
如果有這種跳出需求,可以考慮將這個if語句和其他被跳出的部分放在一個僅循環一次的循環結構中,這樣就可以利用break來跳出。
Ⅳ java中,怎麼跳出兩層FOR循環
採用標簽方式跳出,指定跳出位置。
具體如下:
a:for(int i=0;i<n;i++) {
b:for(int j=0;j<n;j++) {
if(n=0) {
break a;
}
}
public void forEachTest() throws Exception{
int max=100;
outer:for(int i=0;i<max;i++){
System.out.println("外層for循環,第("+(i+1)+")次循環開始++++++");
(4)java怎麼跳出if擴展閱讀:
for循環一般形式為:
for(單次表達式;條件表達式;末尾循環體)
{
中間循環體;
}
其中,表示式皆可以省略,但分號不可省略,因為「;」可以代表一個空語句,省略了之後語句減少,即為語句格式發生變化,則編譯器不能識別而無法進行編譯。
for循環小括弧里第一個「;」號前為一個為不參與循環的單次表達式,其可作為某一變數的初始化賦值語句, 用來給循環控制變數賦初值; 也可用來計算其它與for循環無關但先於循環部分處理的一個表達式。
倆「;」號之間的條件表達式是一個關系表達式, 其為循環的正式開端,當條件表達式成立時執行中間循環體。
執行的中間循環體可以為一個語句,也可以為多個語句,當中間循環體只有一個語句時,其大括弧{}可以省略,執行完中間循環體後接著執行末尾循環體[2]。
執行末尾循環體後將再次進行條件判斷,若條件還成立,則繼續重復上述循環,當條件不成立時則跳出當下for循環。
Pascal語言中的for循環:
for 循環變數:=初值 to/downto 終值 do
begin
循環體
end;
循環變數從起點到終點每次加1或減1(to 為加1,downto為減1)。
Ⅳ Java中if為什麼不能用break結束語句,這樣會優化一些啊,難道是硬性規定還是另有玄機
同學:在語法里if語句就沒有break的用法,這個break一般是使用在for循環,do····while循環以及Switch語句中,用於退出當前的循環語句,你給斗胡的例嫌銷慶子中:你輸入200,執行到這個if語句,滿足if的條件,執行System.out.println();語句,你不用這個break他也會往下面執行的,走到第二個if語句,但是並不滿足第二個if語句的條件,所以直接跳過,結束這個程序···
希望對你有所幫助,如有什芹握么地方不清楚的,可以追問····
Ⅵ java怎麼跳出do while循環
可以用break語句;條件滿足則立即跳出整個循環;
如代碼,若沒有break;語句,則無限循環while語句;
break語句執行後,While循環只執行了兩次