當前位置:首頁 » 工作應聘 » java多線程面試題

java多線程面試題

發布時間: 2021-01-26 07:14:07

① java面試題 java多線程中有哪些鎖

jvm自帶一個鎖機制,著一般需要知道,
synchronized鎖,掃描全部線程,耗費內存較多,
lock鎖

② java多線程runnable和thread的區別 面試題

runnable和thread的區別(多線程必須用Runable)
Java中有兩種實現多線程的方式以及兩種方式之間的區別
看到一個面試題.問兩種實現多線程的方法.沒事去網上找了找答案.
網上流傳很廣的是一個網上售票系統講解.轉發過來.已經不知道原文到底是出自哪裡了.

Java中有兩種實現多線程的方式。一是直接繼承Thread類,二是實現Runnable介面。那麼這兩種實現多線程的方式在應用上有什麼區別呢?
為了回答這個問題,我們可以通過編寫一段代碼來進行分析。我們用代碼來模擬鐵路售票系統,實現通過四個售票點發售某日某次列車的100張車票,一個售票點用一個線程表示。
首先這樣編寫這個程序:

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測試類:

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類模擬售票處的售票過程,run方法中的每一次循環都將總票數減1,模擬賣出一張車票,同時該車票號列印出來,直接剩餘的票數到零為止。在ThreadDemo1類的main方法中,我們創建了一個線程對象,並重復啟動四次,希望通過這種方式產生四個線程。從運行的結果來看我們發現其實只有一個線程在運行,這個結果 告訴我們:一個線程對象只能啟動一個線程,無論你調用多少遍start()方法,結果只有一個線程。

我們接著修改ThreadDemo1,在main方法中創建四個Thread對象:

Java代碼
public class ThreadDemo1{
public static void main(String[] args){
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
}
}
源碼列印?
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;
}
}
}
}

這下達到目的了嗎?

從結果上看每個票號都被列印了四次,即 四個線程各自賣各自的100張票,而不去賣共同的100張票。這種情況是怎麼造成的呢?我們需要的是,多個線程去處理同一個資源,一個資源只能對應一個對象,在上面的程序中,我們創建了四個ThreadTest對象,就等於創建了四個資源,每個資源都有100張票,每個線程都在獨自處理各自的資源。

經過這些實驗和分析,可以總結出,要實現這個鐵路售票程序,我們只能創建一個資源對象,但要創建多個線程去處理同一個資源對象,並且每個線程上所運行的是相同的程序代碼。在回顧一下使用介面編寫多線程的過程。

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();
}
}
源碼列印?
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--);
}
}
}
}

上面的程序中,創建了四個線程, 每個線程調用的是同一個ThreadTest對象中的run()方法,訪問的是同一個對象中的變數(tickets)的實例,這個程序滿足了我們的需求。在Windows上可以啟動多個記事本程序一樣,也就是多個進程使用同一個記事本程序代碼。

可見, 實現Runnable介面相對於繼承Thread類來說,有如下顯著的好處:

(1)適合多個相同程序代碼的線程去處理同一資源的情況,把虛擬CPU(線程)同程序的代碼,數據有效的分離,較好地體現了面向對象的設計思想。

(2)可以避免由於Java的單繼承特性帶來的局限。我們經常碰到這樣一種情況,即當我們要將已經繼承了某一個類的子類放入多線程中,由於一個類不能同時有兩個父類,所以不能用繼承Thread類的方式,那麼,這個類就只能採用實現Runnable介面的方式了。

(3)有利於程序的健壯性,代碼能夠被多個線程共享,代碼與數據是獨立的。當多個線程的執行代碼來自同一個類的實例時,即稱它們共享相同的代碼。多個線程操作相同的數據,與它們的代碼無關。當共享訪問相同的對象是,即它們共享相同的數據。當線程被構造時,需要的代碼和數據通過一個對象作為構造函數實參傳遞進去,這個對象就是一個實現了Runnable介面的類的實例。

③ 創建線程有幾種不同方式,最常用那種 Java面試題

有三種方式可以用來創建線程:
繼承Thread類
實現Runnable介面
應用程序可以使用Executor框架來創建線程池

實現Runnable介面這種方內式更受歡迎,因為這不需要繼承Thread類。在應用設計中已經繼承了別的對象的情況下,這需要多繼承(而Java不支持多繼承),只能實現接容口。同時,線程池也是非常高效的,很容易實現和使用。

④ java開發面試題哪裡有

1)2017Java面試題及答案:什麼是線程?
線程是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。程序員可以通過它進行多處理器編程,你可以使用多線程對運算密集型任務提速。比如,如果一個線程完成一個任務要100毫秒,那麼用十個線程完成改任務只需10毫秒。Java在語言層面對多線程提供了卓越的支持,它也是一個很好的賣點。欲了解更多詳細信息請點擊這里。
2)2017Java面試題及答案:線程和進程有什麼區別?
線程是進程的子集,一個進程可以有很多線程,每條線程並行執行不同的任務。不同的進程使用不同的內存空間,而所有的線程共享一片相同的內存空間。別把它和棧內存搞混,每個線程都擁有單獨的棧內存用來存儲本地數據。更多詳細信息請點擊這里。
3)2017Java面試題及答案:如何在Java中實現線程?
在語言層面有兩種方式。java.lang.Thread 類的實例就是一個線程但是它需要調用java.lang.Runnable介面來執行,由於線程類本身就是調用的Runnable介面所以你可以繼承java.lang.Thread 類或者直接調用Runnable介面來重寫run()方法實現線程。更多詳細信息請點擊這里.
4)2017Java面試題及答案:用Runnable還是Thread?
這個問題是上題的後續,大家都知道我們可以通過繼承Thread類或者調用Runnable介面來實現線程,問題是,那個方法更好呢?什麼情況下使用它?這個問題很容易回答,如果你知道Java不支持類的多重繼承,但允許你調用多個介面。所以如果你要繼承其他類,當然是調用Runnable介面好了。更多詳細信息請點擊這里。
5)2017Java面試題及答案:Thread 類中的start() 和 run() 方法有什麼區別?
這個問題經常被問到,但還是能從此區分出面試者對Java線程模型的理解程度。start()方法被用來啟動新創建的線程,而且start()內部調用了run()方法,這和直接調用run()方法的效果不一樣。當你調用run()方法的時候,只會是在原來的線程中調用,沒有新的線程啟動,start()方法才會啟動新線程。更多討論請點擊這里
6)2017Java面試題及答案:Java中Runnable和Callable有什麼不同?
Runnable和Callable都代表那些要在不同的線程中執行的任務。Runnable從JDK1.0開始就有了,Callable是在JDK1.5增加的。它們的主要區別是Callable的 call() 方法可以返回值和拋出異常,而Runnable的run()方法沒有這些功能。Callable可以返回裝載有計算結果的Future對象。我的博客有更詳細的說明。
7)2017Java面試題及答案:Java中CyclicBarrier 和 CountDownLatch有什麼不同?
CyclicBarrier 和 CountDownLatch 都可以用來讓一組線程等待其它線程。與 CyclicBarrier 不同的是,CountdownLatch 不能重新使用。點此查看更多信息和示例代碼。

⑤ java有關線程的面試題

http://..com/question/346850241.html

⑥ 某公司面試題java11使用並發多線程加速下載文件,如何寫

先建一個用於下載文件的多線程類,通常要指明下載文件的位置(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)//初始化靜態欄位,初始化的代碼不用我寫吧
}
然後,指明同步塊,目的是讓各個線程共享一個文件資源,那樣它們可以知道同一個文件的下載狀況(即獲取其他線程下載文件到哪個位置,以防重復下載)
public synchronized void fileDownload()//此方法用於下載文件,一般的Java程序員都會寫,實在不會我可以幫你補上
或者
public void fileDownload(){
synchronized(file){
synchronized(url){
synchronized(storagePath){
}}}}//給每個欄位加上同步塊
run()方法的實現就以自己的喜好去寫吧,只要裡面調用了fileDownload()方法就行。
public void run(){

fileDownload();//下載文件

}
然後,在主類的main方法中創建一個多線程數組:
Runnable[] fds=new FileDownloader[線程數量];//fds為file_downloaders縮寫
Thread[] threads=new Thread[線程數量];
最後使用循環把所有的線程逐一啟動。
for(int i=0;i<線程數量;i++){
threads[i]=new Thread(fds[i]);
threads[i].start();
}

⑦ JAVA面試題 JAVA中創建線程有幾種不同的方式

第一種方式:使用Runnable介面創建線程

第二種方式:直接繼承Thread類創建對象

使用Runnable介面創建線程版

1.可以將CPU,代碼權和數據分開,形成清晰的模型

2.線程體run()方法所在的類可以從其它類中繼承一些有用的屬性和方法

3.有利於保持程序的設計風格一致

直接繼承Thread類創建對象

1.Thread子類無法再從其它類繼承(java語言單繼承)。

2.編寫簡單,run()方法的當前對象就是線程對象,可直接操作。

在實際應用中,幾乎都採取第一種方式

⑧ JAVA面試題 JAVA中創建線程有幾種不同的方式

第一種方式:使用Runnable介面創建線程
第二種方式:直接繼承Thread類創建對象
使用Runnable介面創建線回程
1.可以將答CPU,代碼和數據分開,形成清晰的模型
2.線程體run()方法所在的類可以從其它類中繼承一些有用的屬性和方法
3.有利於保持程序的設計風格一致
直接繼承Thread類創建對象
1.Thread子類無法再從其它類繼承(java語言單繼承)。
2.編寫簡單,run()方法的當前對象就是線程對象,可直接操作。
在實際應用中,幾乎都採取第一種方式

⑨ java 線程面試題

我不知道你是不是這個意思,thread1,thread2兩個線程每次讓j增加1,thread3,thread4兩個線程每次讓j減少1,四個線程每個都調用250次相關加減一操作。最終j的結果都是100.
下面程序,總計會列印出1000個數,不管怎麼樣最後一個數永遠是100,即j的終值永遠是100,為了看中間結果運行過程我加了sleep,但無關緊要。你看看符合你要求不?
就像樓上說的,啟動1000條線程不是很明白,不一致的繼續討論
package com.kalort;

public class ThreadTest
{
public static void main(String[] args)
{
Operator operator = new Operator();
Thread thread1 = new IncreaseThread(operator);
Thread thread2 = new IncreaseThread(operator);
Thread thread3 = new DecreaseThread(operator);
Thread thread4 = new DecreaseThread(operator);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}

class IncreaseThread extends Thread
{
private Operator operator;

public IncreaseThread(Operator operator)
{
this.operator = operator;
}

public void run()
{
for (int i = 0; i < 250; i++)
{
try
{
Thread.sleep((long)(Math.random() * 100));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
operator.increase();
}
}
}

class DecreaseThread extends Thread
{
private Operator operator;

public DecreaseThread(Operator operator)
{
this.operator = operator;
}

public void run()
{
for (int i = 0; i < 250; i++)
{
try
{
Thread.sleep((long)(Math.random() * 100));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
operator.decrease();
}
}
}

class Operator
{
private int j = 100;

public synchronized void increase()
{
while (100 != j)
{
try
{
wait(); // 如果另外線程還沒減一就等待
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
j++;
System.out.println(j);
notify(); // 通知另外線程已經加一了。
}

public synchronized void decrease()
{
while (100 == j)
{
try
{
wait();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
j--;
System.out.println(j);
notify();
}
}

⑩ 面試題:Java線程死鎖怎麼解決

1,互斥條件
2,請求和保持條件
3,不剝奪條件
4,環路等待條件 你把其中一個條件解除了就能解決死鎖這道面試題 我上次去公司我就是這樣回答了 過了~

熱點內容
鬼片高清畫質。電影。 發布:2024-08-19 09:14:10 瀏覽:650
一家看電影網 發布:2024-08-19 08:57:54 瀏覽:155
韓國大屍度電影推薦 發布:2024-08-19 08:55:58 瀏覽:719
接吻電影的名字美國 發布:2024-08-19 08:41:41 瀏覽:758
韓劇女主高中就懷孕了劇名 發布:2024-08-19 08:00:29 瀏覽:692
藍色頭發電影女主角 發布:2024-08-19 07:51:59 瀏覽:849
台灣電影老師上了學生 發布:2024-08-19 07:36:20 瀏覽:964
兩人吃屎的電影 發布:2024-08-19 07:25:07 瀏覽:450
有裸露下體的大尺度電影嗎 發布:2024-08-19 07:20:50 瀏覽:790
好看的電影在線觀看免費 發布:2024-08-19 06:55:37 瀏覽:912