Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中定义多线程_Java_Multithreading_Sorting - Fatal编程技术网

在Java中定义多线程

在Java中定义多线程,java,multithreading,sorting,Java,Multithreading,Sorting,我正在写一个程序,从文件中读取单词并按字母顺序排序。在命令行中提供输入和输出文件,程序从输入文件中读取单词,并将排序列表写回输出文件。这已经完成了,而且它的工作方式也应该如此。这里没有问题 我不是在寻找具体的代码,而是在寻找如何解决问题的帮助。分配的下一部分说明,在命令行中,您可以设置希望程序在排序过程中使用的线程数 例如,如果使用以下命令进行编译: java Sort 12 infile.txt outfile.txt 上述程序将使用12个线程对“infle.txt”中的单词进行排序。每个线

我正在写一个程序,从文件中读取单词并按字母顺序排序。在命令行中提供输入和输出文件,程序从输入文件中读取单词,并将排序列表写回输出文件。这已经完成了,而且它的工作方式也应该如此。这里没有问题

我不是在寻找具体的代码,而是在寻找如何解决问题的帮助。分配的下一部分说明,在命令行中,您可以设置希望程序在排序过程中使用的线程数

例如,如果使用以下命令进行编译:

java Sort 12 infile.txt outfile.txt
上述程序将使用12个线程对“infle.txt”中的单词进行排序。每个线程对N=(numberOfWords)/(numberOfThreads)个字进行排序。在线程启动之前,所有单词都被读入内存。我知道这听起来可能有点神秘,但我一直在谷歌上搜索关于“多线程”/“定义Java程序中的线程数”的好解释,但我一点也不聪明

如果有人知道如何在Java中设置线程数,即使只是一个小例子,我也会非常感激


谢谢

定义一个可运行线程,然后在循环中将具有该可运行线程的新线程添加到列表中。然后在同一个循环或单独的循环中启动所有线程,将需要处理的所有字传递给每个可运行的on构造?
您还必须根据访问方式控制对输出文件的访问,可能还有对输入文件的访问,否则您的线程将遇到麻烦,因此请查看竞态条件以及如何处理竞态条件定义一个可运行的,然后在循环中将具有该可运行的新线程添加到列表中。然后在同一个循环或单独的循环中启动所有线程,将需要处理的所有字传递给每个可运行的on构造?
您还必须根据访问方式控制对输出文件的访问,也可能控制对输入文件的访问,否则您的线程将遇到麻烦,因此请查看竞态条件以及如何处理它们。线程只是一个带有“run”方法的类

创建该类并让它扩展线程或实现Runnable。如果扩展线程,只需对其调用thread.start(),即可启动线程。如果改为实现Runnable,则必须执行类似于Thread t=new Thread(您的RunnableClass);,然后开始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
        }
    }
公共类排序{
类RunnableClass实现Runnable(){
字符串参数;
RunnableClass(字符串[]args){
this.args=args;
}
运行(){
//做你的分类
}
}
公共静态void main(字符串[]args){
//一些将arg 0以外的arg切分为数组或其他内容的代码
int numberOfThreads=Integer.parseInt(args[0]);

对于(intx=0;x哦,当然可以。线程只是一个带有“run”方法的类

创建类并让它扩展Thread或实现Runnable。如果扩展Thread,只需对其调用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
        }
    }
公共类排序{
类RunnableClass实现Runnable(){
字符串参数;
RunnableClass(字符串[]args){
this.args=args;
}
运行(){
//做你的分类
}
}
公共静态void main(字符串[]args){
//一些将arg 0以外的arg切分为数组或其他内容的代码
int numberOfThreads=Integer.parseInt(args[0]);

对于(int x=0;x您可以使用Executors.newFixedThreadPool(int nThreads)方法(请参阅详细信息)获取具有所需线程数的线程池。然后,将您的工作划分为适当数量的块(示例中为12个),为每个工作块创建一个可运行对象,并将这些可运行对象传递给线程池的方法。

您可以使用Executors.newFixedThreadPool(int-nThreads)方法(请参阅详细信息)获取具有所需线程数目的线程池。然后,将您的工作划分为适当数量的块(示例中为12个),为每个工作块创建一个可运行对象,并将这些可运行对象传递给线程池的方法。

执行者
类具有静态的
newFixedThreadPool(int numberOfThreads)
,可以为线程池提供线程数。例如,如果您有实现可运行的类

    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());
    }
。。
int numberOfThreads=5;
ExecutorService srv=Executors.newFixedThreadPool(线程数);
for(int i=0;i

使用
ExecutorService
可以更轻松地管理线程的生命周期。有关详细信息,请阅读。

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());
    }
。。
int numberOfThreads=5;
ExecutorService srv=Executors.newFixedThreadPool(线程数);
for(int i=0;i

使用
ExecutorService
可以更轻松地管理线程的生命周期。有关详细信息,请阅读。

这里我想问您一个问题,您使用的是哪一版本的java。因为这项任务不是很容易实现的,因为您需要注意