[英]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 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.