我正在编写一个程序,它从文件中读取单词并按字母顺序对它们进行排序。您在命令行中提供输入和输出文件,程序从输入文件中读取单词并将排序后的列表写回输出文件。这样做了,它应该工作。这里没有问题。
我不是在寻找具体的代码,而是寻求如何处理问题。赋值的下一部分指出,在命令行中,您将能够设置希望程序在排序过程中使用的线程数。
例如,如果您使用以下代码进行编译:
java Sort 12 infile.txt outfile.txt
上述程序意味着使用12个线程对“infile.txt”中的单词进行排序。每个线程用于对多个N =(numberOfWords)/(numberOfThreads)字进行排序。在线程启动之前,所有单词都被读入内存。我知道这可能听起来很神秘,但我一直在谷歌上寻找关于“多线程”/定义Java程序中线程数量的一个很好的解释,但我并不是更明智。
如果有人知道如何解释如何设置Java中的线程数,即使只是一个小例子,我将非常感激!
谢谢!
答案 0 :(得分:0)
哦,当然。一个线程只是一个带有“run”方法的类。
您创建该类,并让它扩展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进行排序,依此类推。
线程可以相互通信,共享状态或拥有自己的状态等。有很多方法可以实现这一点。
线程可以终止,或者可以重入,可以具有状态等
答案 1 :(得分:0)
您可以使用Executors.newFixedThreadPool(int nThreads)方法(请参阅详细信息here)来获取具有所需线程数的ThreadPool。然后,将您的工作分成适当数量的块(在您的示例中为12),为每个工作块创建一个Runnable对象,并将这些Runnable对象传递给ThreadPool的submit方法。
答案 2 :(得分:0)
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 concurrency tutorial以获取更多信息。
答案 3 :(得分:0)
在这里,我想问你一个问题是你正在使用哪个版本的java。因为这个任务并不容易实现,因为你需要处理诸如线程连接之类的事情.Java 7有一个功能&#39; Fork/Join
&#39;你可以通过它来利用这项任务。
您可以参考以下内容作为示例。
你可以从这个
开始答案 4 :(得分:0)
您正在寻找的是Fork / Join框架。这会将单个任务拆分为多个部分,将部件交给多个线程进行处理。
ExecutorService的FixedThreadPool允许您创建12个工作线程,但让您完成分离线程之间工作的所有艰苦工作。 Fork / Join框架使这很容易,使用递归系统在需要时将进程分解,以便可以在线程之间进行拆分。
http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html
答案 5 :(得分:-1)
定义一个runnable,然后在循环中添加具有该runnable的新线程到列表中。然后在相同的循环或单独的循环中启动所有线程,将所有需要处理的单词传递给构造中的每个runnable? 你还必须控制对输出文件的访问,可能还有输入文件,具体取决于你如何访问它,否则你的线程会遇到麻烦,所以看一下竞争条件以及如何处理它们