2010-05-19 31 views
8

今天我在一次採訪中被問到Java中的Thread概念嗎?問題是...Java中的線程

  1. 什麼是線程?
  2. 我們爲什麼要穿線?
  3. 線程的實時示例。
  4. 我們可以在Spring框架服務類中創建線程。
  5. 可以彈性調用線程?

除了Thread的定義之外,我沒有回答任何問題,我也是從互聯網上學到的。

任何人都可以解釋清楚這一點。

更新

是什麼的線程和普通的Java類之間的差異。我們爲什麼需要線程...我可以在線程中執行業務邏輯嗎? 我可以在線程中調用不同的類方法。

+2

迂腐尖端獲得Java的問題,要採取更嚴重的:它的「Java」,而不是「JAVA」。這不是一個縮寫。 – Syntactic 2010-05-19 12:17:59

+3

我不知道4或5,但是去編程面試時沒有基礎知識來回答1-3對我來說似乎很奇怪(即他們與Java無關)。 – Rhangaun 2010-05-19 12:21:15

+0

請添加面試問題標籤。 – 2010-05-19 13:40:03

回答

8

要創建線程,創建一個擴展Thread類的新類並實例化該類。擴展類必須重寫run()方法並調用start()方法才能開始執行線程。

在run()中,您將定義構成新線程的代碼。理解run()可以調用其他方法,使用其他類並像主線程一樣聲明變量很重要。唯一的區別是run()爲程序中的另一個併發執行線程建立入口點。這將在run()返回時結束。

public class MyThread extends Thread { 

    String word; 

    public MyThread(String rm){ 
    word = rm; 
    } 

    public void run(){ 

    try { 

     for(;;){ 
     System.out.println(word); 
     Thread.sleep(1000); 
     } 

    } catch(InterruptedException e) { 

     System.out.println("sleep interrupted");  
    } 
    } 

    public static void main(String[] args) { 

    Thread t1=new MyThread("First Thread"); 
    Thread t2=new MyThread("Second Thread"); 
    t1.start(); 
    t2.start(); 
    } 
} 

輸出屏幕:

First Thread 
Second Thread 
First Thread 
Second Thread 
First Thread 

,看看這個:

http://www.javaworld.com/javaworld/jw-04-1996/jw-04-threads.html

和Spring,你可以使用線程池:

http://static.springsource.org/spring/docs/2.0.x/reference/scheduling.html

+0

我已更新我的帖子,你能解釋一下嗎? – Kevin 2010-05-19 12:28:51

+0

猜測這不是春季日程安排? – ukanth 2010-05-19 12:31:21

+1

最好的做法是實現Runnable,然後將一個Runnable實例傳遞給Thread構造函數,而不是擴展Thread類。 – Adamski 2010-05-19 12:42:56

1

我可以回答第一個3,因爲我不太熟悉Spring或Flex的線程特性。

  1. 線程是具有其自己的寄存器,堆棧和代碼段可在運行過程與其它線程並行(該過程是線程的集合)中的對象。

  2. 您編寫的程序的多線程代碼爲響應用戶交互。想想看,如果你不得不等待瀏覽器完成下載文件,然後才能繼續瀏覽,那將是多麼令人討厭。

  3. 我在#2中舉了一個例子。其他示例包括任何帶有GUI的程序(GUI必須始終在執行後臺任務時響應用戶輸入)或服務器類型的軟件(例如Web服務器),您可能必須每分鐘響應1000個請求。爲每個響應設置一個單獨的線程會更好。

+0

它自己的代碼段?你從哪裏得到這些荒謬的說法?你知道段是什麼嗎?段和段選擇器之間的區別?平坦和分段內存模型之間的區別? – 2016-09-04 16:35:29

1

就Spring而言,是的,你絕對可以創建自己的線程。但使用Spring Framework手冊的Chapter 25中描述的線程池支持是一個更好的主意。

然而,有請求產卵在基於Spring的Web服務(或與此有關的任何Web服務)的線程引入資源管理方面的問題,您可能希望避免...

1

的一個關鍵概念搞清楚是一個線程是一個操作系統調度對象,它恰好有一個代表它的Java類(就像在UI子系統中的Window那樣)。線程本身不是一種類。

1

Flex無法直接與Java線程通信,無論使用JMS還是其他類型的消息都必須通過某種消息傳遞,Flex通過BlazeDS,GraniteDS或LCDS可以與JMS通信。還有一點需要記住的是,目前無論如何,Flash/Flex本身是單線程的,但是高度異步......有人會說TOO是異步的......所以任何使用Java線程來加速事物可能都沒有這是你所希望的效果。

3

多線程是一項Java功能,它允許同時執行程序的兩個或更多部分以最大程度地利用CPU。這種程序的每個部分都稱爲線程。所以,

線程是一個進程內的輕量級進程。

線程可以通過使用兩個機制來創建的:

  1. 擴展Thread類
  2. 實現Runnable接口

線程創建通過擴展Thread類

我們創建一個擴展類java.lang.Thread類。該類覆蓋Thread類中可用的run()方法。一個線程在run()方法中開始其生命。我們創建一個新類的對象並調用start()方法來啓動線程的執行。 Start()Thread對象上調用run()方法。

class MultithreadingDemo extends Thread{ 
public void run() { 
    try { // Displaying the thread that is running 
     System.out.println ("Thread " + Thread.currentThread().getId() 
           + " is running"); 
     } 
     catch (Exception e){ // Throwing an exception 
      System.out.println ("Exception is caught"); 
     } 
    } 
} 
public class Multithread{ 
    public static void main(String[] args) { 
     int n = 8; // Number of threads 
     for (int i=0; i<8; i++)  { 
      MultithreadingDemo object = new MultithreadingDemo(); 
      object.start(); 
     } 
    } 
} 

線程創建通過實現Runnable接口

我們創建一個實現java.lang.Runnable接口和覆蓋run()方法的新類。然後我們實例化一個Thread對象並在這個對象上調用start()方法。

class MultithreadingDemo implements Runnable{ 
public void run() { 
    try {  // Displaying the thread that is running 
     System.out.println ("Thread " + Thread.currentThread().getId() + 
          " is running"); 

    } 
    catch (Exception e) {  // Throwing an exception 
     System.out.println ("Exception is caught"); 
    } 
    } 
} 
class Multithread{ 
    public static void main(String[] args) { 
     int n = 8; // Number of threads 
     for (int i=0; i<8; i++)  { 
      Thread object = new Thread(new MultithreadingDemo()); 
      object.start(); 
     } 
    } 
} 

Thread類VS Runnable接口

  1. 如果我們擴展了Thread類,我們的類不能擴展任何其他類,因爲Java不支持多重繼承。但是,如果我們實現Runnable接口,我們的類仍然可以擴展其他基類。

  2. 我們可以通過擴展Thread類來實現線程的基本功能,因爲它提供了Runnable接口中不可用的某些內置方法,如yield(),interrupt()等。

0

看一看甲骨文tutorial

  1. 什麼是線程?

線程有時稱爲輕量級進程。線程存在於一個進程中 - 每個進程至少有一個線程。線程共享進程的資源,包括內存和打開的文件。這使得溝通有效但可能有問題。

  1. 爲什麼我們要穿線?

    1. 多線程執行是Java平臺的基本功能。線程是彼此獨立的。

    2. 您可以通過分解多個子計算來並行化您的計算。

    3. 您可以有效地使用服務器的CPU核心。

    例如,

    ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime() 
          .availableProcessors()); 
    

    如果您在線程之間遵循無共享的方法(這是不可能的),多線程應用程序提供了高吞吐量。

  2. 線程上的實時示例。

    想想WhatsApp類型的聊天應用程序。

    服務器應該在數以千計的用戶之間發送和接收聊天消息。單線程應用程序是處理這種用例的災難。

是什麼的線程和普通的Java類之間的差異。爲什麼我們需要線程......我可以在線程中執行業務邏輯嗎?我可以在線程中調用不同的類方法嗎?

Thread類可以實現Runnable或擴展Thread。看看甲骨文教程page

可以在線程中執行業務邏輯。

您可以調用線程不同類的方法。

0

好回答什麼是線程在Java中簡單的一句話其程序/件的與您的正常類同時工作的代碼。普通類和線程的不同之處在於線程與普通類一起同時工作。 用更簡單的術語讓我們看看一個例子,其中我當前在主函數中,並且需要一個函數來計算某些東西。所以如果該函數不在一個線程中,那麼該函數將被首先評估,然後在另一方面,如果它是一個線程,我將返回到主函數,然後該函數將計算並且main將計算其下一條指令。

現在,作爲給一個線程的創建 1.延伸線程類:延伸線程類和寫start()其一個函數使用當前類的對象調用它,並且即寫一個函數void run()和在此函數寫代碼,其需要同時執行。

擴展線程的類的每個對象都是一個自定義的線程。默認情況下,每個線程都處於非活動狀態,並激活或調用該線程只寫start()這會自動調用包含您的代碼的運行。

class MyThreads extends Thread 
{ 
int ch ; 

MyThreads(int p) 
{ 
    ch = p; 
    start();//statement to activate thread and call run 
} 

public void run() 
{ 
    if(ch == 1) 
    functionx() 
    else if(ch == 2) 
    functiony(); 

} 

void fx1() 
{ 
    //parallel running code here 
} 

void fx2() 
{ 
    //parallel running code here 
} 

public static void main(String args[]) 
{ 

    MyThreads obj1 = new MyThreads(1); 
    My3Threads obj2 = new MyThreads(2); 

    //mains next instruction code here 

} 
} 
  • 還可以實現一個接口即Runnable但因爲這是一個界面,該界面與當前類因此調用開始將調用這是寫在接口功能run()兼容但撥打我們的run()函數調用start像這樣Thread t=new thread(this); t.start();
  • 一個線程對象我們爲什麼我們去線程,這就好比問爲什麼我們去爲多核處理器你得到我的意思,多線程用於同時執行任務

    一個實時的例子是一個服務器的任何服務器,考慮Gmail.So的服務器如果g郵件服務器不使用多線程的話,我不能沒有你退出,這意味着在全世界登錄只寫了一個人可以一次登錄,看看它是多麼不切實際。