簡體   English   中英

Java 中的線程

[英]Threads in Java

今天我在接受采訪時被問到 Java 中的線程概念? 問題是...

  1. 什么是線程?
  2. 我們為什么要進行線程化?
  3. 線程上的實時示例。
  4. 我們可以在 Spring 框架服務類中創建線程嗎?
  5. flex 可以調用線程嗎?

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

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

更新

線程和普通的 java 類有什么區別。 為什么我們需要線程......我可以在線程中執行業務邏輯嗎? 我可以在線程中調用不同的類方法嗎?

要創建線程,請創建一個擴展Thread類的新類,然后實例化該類。 擴展類必須覆蓋run方法並調用start方法以開始執行線程。

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

下面是一個例子:

public class MyThread extends Thread {
    private final String name;

    public MyThread(String name) {
        this.name = name;
    }

    public void run() {
        try {
            for (; ; ) {
                System.out.println(name);
                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

本教程還解釋了Runnable接口。 使用 Spring,您可以使用線程池

多線程是一種 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();
        }
    }
}

線程類與可運行接口

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

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

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

  1. 線程是具有自己的寄存器和堆棧的對象,可以與進程中的其他線程並行運行(進程是線程的集合)。

  2. 您為程序編寫多線程代碼以響應用戶交互。 想想如果您必須等待瀏覽器完成下載文件才能繼續瀏覽,那該有多煩人。

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

需要澄清的一個關鍵概念是線程是一個操作系統調度對象,它恰好有一個代表它的 Java 類(例如,Window 在 UI 子系統中)。 線程本身不是一種類。

Flex 不能直接與 Java 線程通信,無論您使用 JMS 還是其他方式,都必須有某種消息傳遞,Flex 通過 BlazeDS、GraniteDS 或 LCDS 可以與 JMS 通信。 還需要記住的一件事是,無論如何,目前 Flash/Flex 本身是單線程的,但高度異步......有些人會說太異步......所以任何使用 Java 線程來加快速度的可能都沒有與您希望的一樣大的效果。

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

但是,讓請求在基於 Spring 的 Web 服務(或任何與此相關的 Web 服務)中產生線程會引入您可能想要避免的資源管理問題......

看看oracle 教程

  1. 什么是線程?

線程有時被稱為輕量級進程。 線程存在於一個進程中——每個進程至少有一個。 線程共享進程的資源,包括內存和打開的文件。 這有助於實現高效但可能存在問題的溝通。

  1. 我們為什么要進行線程化?

    1. 多線程執行是 Java 平台的一個基本特性。 線程是相互獨立的。

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

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

    例如

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

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

  2. 線程上的實時示例。

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

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

線程和普通的 java 類有什么區別。 為什么我們需要線程......我可以在線程中執行業務邏輯嗎? 我可以在線程中調用不同的類方法嗎?

Thread 類可以實現Runnable或擴展Thread 看看oracle教程頁面

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

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

好的,用簡單的詞來回答什么是 java 中的線程,它是一個程序/一段代碼,它與您的普通類同時工作。 普通類和線程之間的區別在於,線程與普通類並行工作。 用更簡單的術語來說,讓我們看一個示例,其中我目前在 main 函數中並且需要一個函數來計算某些東西。 因此,如果該函數不在線程中,則該函數將首先被評估,然后我將返回到 main 函數,另一方面,如果它是一個線程,則該函數將計算並且 main 還將計算其下一條指令。

現在關於如何創建線程 1. 擴展線程類:擴展線程類並編寫start()它的一個函數,使用當前類的對象調用它並編寫一個函數,即void run()並在此函數中編寫代碼需要同時進行。

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

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

 }
}
  1. 您還可以實現一個接口,即Runnable但由於這是一個與當前類兼容的接口,因此調用 start 將調用編寫在接口中的函數run() ,但調用我們的run()函數調用 start 與像這樣的線程對象Thread t=new thread(this); t.start(); Thread t=new thread(this); t.start();

現在我們為什么要使用線程,這就像問我們為什么要使用多核處理器一樣,您明白我在說什么,多線程用於並發執行任務

一個實時的例子是一個服務器,任何服務器,考慮 Gmail 的服務器。所以如果 g 郵件服務器不是使用多線程編寫的,那么我無法在沒有您注銷的情況下登錄,這意味着在整個世界中只有一個人可以登錄有一次你會發現這是多么不切實際。

http://learningsolo.com/multithreading/

多線程是在單個程序中同時執行兩個或多個線程的過程。 單核處理器一次可以執行一個線程,但操作系統使用時間切片功能來共享處理器時間。 線程是一個輕量級的進程。 線程存在於進程中,需要較少的資源來創建。 它共享進程資源。 當 java 應用程序啟動時,它會為 main 創建第一個用戶線程,然后生成多個用戶線程和守護線程。 線程調度器調度線程執行。 當所有線程的工作完成后,JVM 終止應用程序。

每個java應用程序至少有一個線程——主線程。 雖然,在后台運行着很多其他的 java 線程,比如內存管理、系統管理、信號處理等。但是從應用程序的角度來看——main 是第一個 java 線程,我們可以從中創建多個線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM