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
paraller程序Java中的Erastotenes筛_Java_Multithreading - Fatal编程技术网

paraller程序Java中的Erastotenes筛

paraller程序Java中的Erastotenes筛,java,multithreading,Java,Multithreading,我想做一个程序,使用Erastotenes筛计算素数。在本期中,我想使用信号量在线程之间进行通信,以便对带有数字的表进行计算。 到目前为止,我已经编写了这样的代码 public static void main( String[] args ) throws InterruptedException { System.out.println("Podaj gorny zakres\n"); Scanner scanner = new Scanner(System.

我想做一个程序,使用Erastotenes筛计算素数。在本期中,我想使用信号量在线程之间进行通信,以便对带有数字的表进行计算。 到目前为止,我已经编写了这样的代码

public static void main( String[] args ) throws InterruptedException {
        System.out.println("Podaj gorny zakres\n");
        Scanner scanner = new Scanner(System.in);
        Erastotenes erastotenes = new Erastotenes(Integer.parseInt(scanner.nextLine()));
        erastotenes.initializeTable();


        long start = System.nanoTime();

        List<SingleProcess.MyThread> list = new ArrayList<>();

        List<Integer> numbers = Dollar.$(2,erastotenes.getMaximumNumber()+1).toList();

        for(int i=0;i<2;i++)
        {
            list.add(new SingleProcess.MyThread(erastotenes,numbers.subList((numbers.size()/2)*i,(numbers.size()/2)*i+numbers.size()/2)));
            list.get(list.size()-1).start();
            list.get(list.size()-1).join();
        }

        System.out.println(System.nanoTime() - start);

        //System.out.println("Liczba elementów: "+erastotenes.countPrimeElements());
    }
publicstaticvoidmain(String[]args)抛出InterruptedException{
System.out.println(“Podaj gorny zakres\n”);
扫描仪=新的扫描仪(System.in);
Erastotenes Erastotenes=新的Erastotenes(Integer.parseInt(scanner.nextLine());
erastotenes.initializeTable();
长启动=System.nanoTime();
列表=新的ArrayList();
列表编号=美元。$(2,erastotenes.getMaximumNumber()+1.toList();

对于(int i=0;i我认为您的主要问题是:

    for(int i=0;i<2;i++)
    {
        list.add(new SingleProcess.MyThread(erastotenes,numbers.subList((numbers.size()/2)*i,(numbers.size()/2)*i+numbers.size()/2)));
        list.get(list.size()-1).start();
        list.get(list.size()-1).join();
    }

for(int i=0;i我认为您的主要问题是:

    for(int i=0;i<2;i++)
    {
        list.add(new SingleProcess.MyThread(erastotenes,numbers.subList((numbers.size()/2)*i,(numbers.size()/2)*i+numbers.size()/2)));
        list.get(list.size()-1).start();
        list.get(list.size()-1).join();
    }

for(int i=0;i什么做
Dollar.$(2,erastotenes.getMaximumNumber()+1)
do?将列表从到2填充到扫描器中给定的数字。这样,我可以将列表分成两个子列表,每个子列表分为特定的线程。
Dollar.$(2,erastotenes.getMaximumNumber()+1)
do?将列表从到2填充到scanner中给定的数字。这样,我可以将列表分成两个子列表,每个子列表都包含到特定的线程中。使用信号量并保持并行性是否可行?@maciejka只需完全删除信号量并更改连接,我发布时,它将并行运行。它工作正常,但我仍然有一个问题estion。在这个erastotenes筛中,使用信号量对保证同步和正常工作是无用的?@maciejka是的。如果并发读取和写入之间存在冲突,则需要同步。如果您只在写入而从不读取,则同步没有多大意义。@maciejka,等等,我错了,您确实读取了arr是的,当您选择下一个要筛选的数字时…线程可能会开始筛选不需要筛选的数字(例如,100,因为2的筛选尚未将数组[100]设置为0)。这没关系,它做了多余的工作,但仍然得到了正确的结果。使用信号量并保持并行性是否可能?@maciejka只需完全删除信号量并更改连接,正如我发布的,它将并行运行。它工作得很好,但我仍然有一个问题。在这个使用信号量的erastotenes筛中hore对于保证同步和正常工作是无用的?@maciejka是的。如果并发读取和写入之间存在冲突,则需要同步。如果您只在写入而从不读取,则同步没有多大意义。@maciejka,等等,我错了,当您选择下一个要筛选的数字时,您确实读取了数组。..线程可能会开始筛选不需要筛选的数字(例如,100,因为2的筛选尚未将数组[100]设置为0)。不过这并不重要,它做了多余的工作,但仍然得到了正确的结果。
    for(int i=0;i<2;i++)
    {
        list.add(new SingleProcess.MyThread(erastotenes,numbers.subList((numbers.size()/2)*i,(numbers.size()/2)*i+numbers.size()/2)));
        list.get(list.size()-1).start();
        list.get(list.size()-1).join();
    }
    for(int i=0;i<2;i++)
    {
        list.add(new SingleProcess.MyThread(erastotenes,numbers.subList((numbers.size()/2)*i,(numbers.size()/2)*i+numbers.size()/2)));
        list.get(list.size()-1).start();
    }
    for (Thread t : list) {
        t.join();
    }