簡體   English   中英

在Java中定義多個線程

[英]Defining Multiple Threads in Java

我正在編寫一個程序,該程序從文件中讀取單詞並按字母順序對其進行排序。 您可以在命令行中提供輸入和輸出文件,程序將從輸入文件中讀取單詞,然后將排序后的列表寫回到輸出文件中。 這已經完成,並且它應該按預期方式工作。 這里沒有問題。

我不是在尋找特定的代碼,而是在如何解決問題方面提供幫助。 分配的下一部分指出,在命令行中,您將能夠設置希望程序在排序過程中使用的線程數。

例如,如果使用以下命令進行編譯:

java Sort 12 infile.txt outfile.txt

上面的程序旨在使用12個線程對“ infile.txt”中的單詞進行排序。 每個線程將對N =(numberOfWords)/(numberOfThreads)個單詞進行排序。 在啟動線程之前,將所有單詞讀入內存。 我知道這聽起來似乎很神秘,但是我一直在尋找有關“多線程” /定義Java程序中線程數的很好的解釋,但是我並不明智。

如果有人知道如何解釋如何在Java中設置線程數,即使僅舉一個小例子,我也將不勝感激!

謝謝!

行,可以。 線程只是帶有“運行”方法的類。

您創建該類,並使其擴展Thread或實現Runnable。 如果擴展線程,則可以僅在其上調用Thread.start(),這將啟動線程。 如果要實現Runnable,則必須這樣,例如Thread t = new Thread(yourRunnableClass);,然后啟動T。

因此,對於您的示例:

    public class Sort {

        class RunnableClass implements Runnable(){
            String args;
            RunnableClass(String[] args){
               this.args = args;
            }
            run(){
               //Do your sorting
            }
        }

        public static void main(String[] args){
            //some code that chops the args beyond arg 0 into arrays or something
            int numberOfThreads = Integer.parseInt(args[0]);
            for(int x=0;x<numberOfThreads;x++){
               Thread t = new Thread(new RunnableClass(String[] wordsToSort));
            }
            //something to manage the threads and coordinate their work
        }
    }

您可以使它變得更加復雜或復雜,一種簡單的實現方式是將單詞循環,將2傳遞給每個線程進行排序,然后在線程完成后,如果順序不變,則該順序沿列表遞增,直到順序不變。 那是泡沫排序的一種形式。 換句話說,線程A對單詞1和2進行排序。線程B對單詞3和4進行排序,依此類推。

線程可以相互通信,共享狀態或擁有自己的狀態,等等。有許多方法可以實現此目的。

線程可以終止,也可以重新進入,可以具有狀態等。

您可以使用Executors.newFixedThreadPool(int nThreads)方法(請參見此處的詳細信息)來獲取具有所需線程數的ThreadPool。 然后,將您的工作划分為適當數量的塊(在您的示例中為12),為每個工作塊創建一個Runnable對象,並將這些Runnable對象傳遞給ThreadPool的Submit方法。

Executors類具有靜態的newFixedThreadPool (int numberOfThreads) ,可以為其指定要池化的線程數。 例如,如果您有實現Runnable的類

    public class MyCustomThread implements Runnable { 

    @Override
    public void run() {
    //do your work
    }
}

您可以像這樣創建具有5個線程的池

   ..
    int numberOfThreads = 5;
    ExecutorService srv = Executors.newFixedThreadPool(numberOfThreads);

    for (int i = 0; i < numberOfThreads; i++) {
            srv.execute(new MyCustomThread());
    }

使用ExecutorService ,可以更輕松地管理線程的生命周期。 閱讀Oracle並發教程以獲取更多信息。

在這里,我想問一個問題,您正在使用哪個版本的Java。 由於完成這項任務並非易事,因為您需要處理諸如線程連接等夫婦事務。Java7具有“ Fork/Join ”功能,您可以利用該功能來利用任務。

您可以參考以下示例。

使用分叉/聯接排序

你可以從這里開始

您正在尋找的是Fork / Join框架。 這將單個任務拆分為多個部分,將這些部分交給多個要處理的線程。

ExecutorService的FixedThreadPool允許您創建12個工作線程,但要把線程之間的工作分開是一件辛苦的工作。 Fork / Join框架使此操作變得容易,如果需要,可以使用遞歸系統將過程分解,以便可以在線程之間進行拆分。

http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html

定義一個可運行對象,然后在循環中將具有該可運行對象的新線程添加到列表中。 然后在同一個循環或單獨的循環中啟動所有線程,將您需要處理的所有單詞傳遞給構造中的每個可運行線程? 您還必須根據對訪問文件的方式來控制對輸出文件的訪問,可能還要控制對輸入文件的訪問,否則線程會遇到麻煩,因此請查看競爭條件以及如何處理它們

暫無
暫無

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

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