在Java中定义多个线程

时间:2014-05-08 15:30:41

标签: java multithreading sorting

我正在编写一个程序,它从文件中读取单词并按字母顺序对它们进行排序。您在命令行中提供输入和输出文件,程序从输入文件中读取单词并将排序后的列表写回输出文件。这样做了,它应该工作。这里没有问题。

我不是在寻找具体的代码,而是寻求如何处理问题。赋值的下一部分指出,在命令行中,您将能够设置希望程序在排序过程中使用的线程数。

例如,如果您使用以下代码进行编译:

java Sort 12 infile.txt outfile.txt

上述程序意味着使用12个线程对“infile.txt”中的单词进行排序。每个线程用于对多个N =(numberOfWords)/(numberOfThreads)字进行排序。在线程启动之前,所有单词都被读入内存。我知道这可能听起来很神秘,但我一直在谷歌上寻找关于“多线程”/定义Java程序中线程数量的一个很好的解释,但我并不是更明智。

如果有人知道如何解释如何设置Java中的线程数,即使只是一个小例子,我将非常感激!

谢谢!

6 个答案:

答案 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;你可以通过它来利用这项任务。

您可以参考以下内容作为示例。

Sorting using Fork/Join

你可以从这个

开始

答案 4 :(得分:0)

您正在寻找的是Fork / Join框架。这会将单个任务拆分为多个部分,将部件交给多个线程进行处理。

ExecutorService的FixedThreadPool允许您创建12个工作线程,但让您完成分离线程之间工作的所有艰苦工作。 Fork / Join框架使这很容易,使用递归系统在需要时将进程分解,以便可以在线程之间进行拆分。

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

答案 5 :(得分:-1)

定义一个runnable,然后在循环中添加具有该runnable的新线程到列表中。然后在相同的循环或单独的循环中启动所有线程,将所有需要处理的单词传递给构造中的每个runnable?    你还必须控制对输出文件的访问,可能还有输入文件,具体取决于你如何访问它,否则你的线程会遇到麻烦,所以看一下竞争条件以及如何处理它们