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_Dictionary_Arraylist_Threadpool - Fatal编程技术网

多线程Java-线程冲突/覆盖问题

多线程Java-线程冲突/覆盖问题,java,multithreading,dictionary,arraylist,threadpool,Java,Multithreading,Dictionary,Arraylist,Threadpool,我使用一个简单的线程池来读取一个大型字典,我编写了一个for循环,循环遍历整个字典(10000个单词),我尝试将它存储到一个线程中,将子arraylist分配给一个要处理的线程 当arraylist中有500个单词时,它会将其存储在类“words”的实例中。这只是存储并允许访问arrayList(分配给该线程的arrayList) 这似乎不起作用,因为字典中有重复的单词,而且大多数时候字典中最后的500个单词都是所有线程最终使用的,我觉得很奇怪。此外,我还注意到,当我在下面显示的for循环的内部

我使用一个简单的线程池来读取一个大型字典,我编写了一个for循环,循环遍历整个字典(10000个单词),我尝试将它存储到一个线程中,将子arraylist分配给一个要处理的线程

当arraylist中有500个单词时,它会将其存储在类“words”的实例中。这只是存储并允许访问arrayList(分配给该线程的arrayList)

这似乎不起作用,因为字典中有重复的单词,而且大多数时候字典中最后的500个单词都是所有线程最终使用的,我觉得很奇怪。此外,我还注意到,当我在下面显示的for循环的内部末尾添加一个3秒的简单超时时,它可以工作,但是这似乎是一个可怕的修复,我希望这个程序尽可能高效和快速

// Executor Program
ExecutorService executor = Executors.newFixedThreadPool(cores);
    ArrayList<String> words123 = new ArrayList<String>();
    for (int i = 0; i < dictionary.size(); i++) {
        words123.add(dictionary.get(i));
        if(words123.size() == 1000) {
            Words wordsList = new Words(words123);
            Runnable worker = new WorkerThread(wordsList, passwords, stp);
            executor.execute(worker);
            words123 = new ArrayList<String>();
        }
    }
    executor.shutdown();
    //wait for all jobs to complete
    while (!executor.isTerminated()) {
    }
    System.out.println("Finished all threads");




// WORD OBJECT ------------------
public class Words {
public static ArrayList<String> words = new ArrayList<String>();

public Words(ArrayList words) {
    this.words = words;
}

public int getSize() {
    return words.size();
}

public String getWord(int i) {
    return words.get(i);
}
//执行程序
ExecutorService executor=Executors.newFixedThreadPool(核心);
ArrayList words123=新的ArrayList();
for(int i=0;i
}

//工作线程----------------
公共静态词词表;
公共静态int-cmd;
public static HashMap passwords=new HashMap();
公共静态SimpleThreadPool stp;
/**
*建造师
*@param s
*/
公共WorkerThread(word、HashMap密码、SimpleThreadPool stp、int cmd){
this.wordList=word;
//System.out.println(“in”+字);
//使用readFromFile方法读入哈希
this.passwords=密码;
此值为0.stp=stp;
this.cmd=cmd;
}
/**
*要使线程池正常工作,请确保run()方法终止
*此方法打印出命令,调用函数,然后打印结束并终止
*/
@凌驾
公开募捐{
//System.out.println(Thread.currentThread().getName()+“Start”);
//System.out.println(“WOOOO”+wordList.getWords()+cmd);
对于(int i=0;i@)
字母符号编辑(通过);
//用大写字母检查密码
//资本编辑(通行证);
//反向密码
反向输入(通过);
//连接字典中的所有单词
//concatEdit(pass);
打印置换(pass);
//生成并附加到字符串的所有可能的数字
对于(int j=0;j<4;j++){
数字生成器(“”,0,j,pass);
}
}
//System.out.println(Thread.currentThread().getName()+“End”);
}

问题在于words类中的'words'变量是静态的,这意味着该类的每个实例都使用相同的列表

此外,由于您试图提高效率,我将使用不同的方法。而不是

ExecutorService executor = Executors.newFixedThreadPool(cores);
使用

LinkedBlockingQueue工作队列=新建LinkedBlockingQueue();
ThreadPoolExecutor executor=新的ThreadPoolExecutor(cores,cores,0L,TimeUnit.ms,workQueue);
executor.prestartalcorethreads();

然后将可运行实例直接添加到工作队列。通过这种方式,您不必等待自己在线程之间划分单词:线程将在完成任务后立即获取它们。

问题在于单词类中的“words”变量是静态的,这意味着该类的每个实例都使用相同的列表

此外,由于您试图提高效率,我将使用不同的方法。而不是

ExecutorService executor = Executors.newFixedThreadPool(cores);
使用

LinkedBlockingQueue工作队列=新建LinkedBlockingQueue();
ThreadPoolExecutor executor=新的ThreadPoolExecutor(cores,cores,0L,TimeUnit.ms,workQueue);
executor.prestartalcorethreads();

然后将可运行实例直接添加到工作队列。通过这种方式,您不必等待自己在线程之间划分单词:线程完成任务后将立即获取单词。

您可以发布一个吗?您可以使用向量代替arrayList吗。我相信向量可以用于同步操作。请在least@may这真的是问题所在吗?在我将arraylist传递给一个类的新实例时,这些实例将如何覆盖。你能发布一个吗?你能用一个向量代替arraylist吗。我相信向量可以用于同步操作。请在least@may这真的是问题所在吗?就我如何将arraylist传递给类的新实例而言,这些实例将如何覆盖。非常感谢!犯了一个非常业余的错误,已经为此工作了几个小时了,谢谢!:)啊,谢谢,它需要尽可能快,所以我从我的问题中删除了我在示例中实现的单词class,现在只需传递arrayList,就可以通过一个实例发送到包含该线程的arrayList的类,您认为这样更有效吗?还感谢您的建议,现在就尝试一下:)因为您已经有了一个线程池,它有权将工作分发给您
LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();
ThreadPoolExecutor executor = new ThreadPoolExecutor(cores, cores, 0L, TimeUnit.MILLISECONDS, workQueue);
executor.prestartAllCoreThreads();