我遇到了一些線程問題。我明白他們是如何工作的,但由於他們都使用相同的方法,我如何運行不同的線程來完成不同的事情,但同時呢?如何在Java中運行不同的線程?
對我來說,他們似乎總是使用相同的標準方法,使他們做同樣的事情。
所以,假設我有一個大的.txt文件,我想要通過每一行,並做一些事情。在這種情況下,我希望每個線程執行.txt文件的1/10,但我不明白線程是如何相互通信的,以及它們如何組織以便每個線程執行正確的部分?
任何人都可以解釋或幫助我嗎?將非常感謝!
我遇到了一些線程問題。我明白他們是如何工作的,但由於他們都使用相同的方法,我如何運行不同的線程來完成不同的事情,但同時呢?如何在Java中運行不同的線程?
對我來說,他們似乎總是使用相同的標準方法,使他們做同樣的事情。
所以,假設我有一個大的.txt文件,我想要通過每一行,並做一些事情。在這種情況下,我希望每個線程執行.txt文件的1/10,但我不明白線程是如何相互通信的,以及它們如何組織以便每個線程執行正確的部分?
任何人都可以解釋或幫助我嗎?將非常感謝!
您可以擴展java.lang.Thread
(或更好 - 實現java.lang.Runnable
)並將參數傳遞給新對象的構造函數。對於文本文件,例如:
public FileReader implements Runnable {
private int startLine;
private int endLine;
public FileReader(int startLine, int endLine) {
// assign the params to the fields
}
public void run() {
// use the params to read the appropriate lines
}
}
,然後您可以:
new Thread(new FileReader(1, 10)).start();
new Thread(new FileReader(11, 20)).start();
new Thread(new FileReader(21, 30)).start();
Bozho,幫了我很多。非常感謝。 我會稍微做一點實驗,稍後會回來反饋。 如果其他人有任何要注意的地方,請這樣做。再次感謝! – 2010-03-19 12:59:27
@CrisCarter我不認爲你知道這一點,但如果任何答案可以幫助你很多(如這個),和/或實際上回答你原來的問題,你應該接受按下上下箭頭下方的勾號你想接受的答案。這樣你會保持你的名聲,其他人會更傾向於幫助你! – Andy 2012-07-24 18:47:23
據我所知,線程並行運行的獨立塊,總有一個主線程(通常是主線程)它控制並行運行的工作線程。由於主線程處理該任務,因此不需要線程彼此進行通信。
在你的情況下,你可以讓主線程向工作線程發送參數,指出線號 - 線程1爲0到10,線程2爲11到20等。工作線程將這些數字作爲輸入並處理文件因此。
現在,您應該看看java.util.Concurrent而不是修改原始線程(雖然它們當然可以在適當的地方使用)。線程是一個相當重要的主題,但是通過使用來自Concurrent
包的明確定義的成語,它可以變得更容易理解。
這是一個很大的問題。也許你應該考慮做一些代碼來刺探它,並且在這個問題中也包含這個代碼 – svrist 2010-03-19 12:27:40
你還必須考慮是否有意義的同時訪問多個線程。如果他們爲每一行執行的工作量非常小,則讀取文件的I/O成本相對較大,而多線程無助於此。如果你做更大的事情(例如從該行的URL下載文件),這可能是個好主意。 – Thilo 2010-03-19 12:36:18