Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.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_Arrays_Multithreading - Fatal编程技术网

Java 在哪里可以使用线程来改进这些方法?

Java 在哪里可以使用线程来改进这些方法?,java,arrays,multithreading,Java,Arrays,Multithreading,好的,对于我在CSC330类中的项目,我应该使用线程来快速找到海量数据集中查询的答案。数组中的每个项目都是一个用户,字符串是他们在由数字标识的网站上访问的网站的集合 示例(数组为字符串用户[]) 用户[1]=“1 4 5 7”用户[2]=“1 2 7 17 10”用户[3]=“6” 查询如下: 查看X的用户是否超过uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 有多少百分比的用户看了X 看X的用户比看Y的用户多吗 有多少用户

好的,对于我在CSC330类中的项目,我应该使用线程来快速找到海量数据集中查询的答案。数组中的每个项目都是一个用户,字符串是他们在由数字标识的网站上访问的网站的集合

示例(数组为字符串用户[])

用户[1]=“1 4 5 7”用户[2]=“1 2 7 17 10”用户[3]=“6”

查询如下:

  • 查看X的用户是否超过uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
  • 有多少百分比的用户看了X
  • 看X的用户比看Y的用户多吗
  • 有多少用户浏览了X次
  • 多大百分比的用户看X多于看Y
这个阵列中大约有一百万用户,我们必须在没有线程的情况下在较小规模的数据版本上解决以下查询以进行测试。我所有的工作。现在我需要切换到海量文本文件,我需要使用线程来提高速度。我想知道它在哪里会有好处,以及如何实现这些线程。我将提供解决每个查询的代码。我认为我可以使用多个线程同时遍历数组的各个部分,但我不确定如何执行

    public boolean query1(String num, String pageName){
    if(num == null){
        return false;
    }
    else
    {
        int userCount = 0;
        int pageNum = convert(pageName);
        System.out.println(pageNum);
        String pageNumString = Integer.toString(pageNum);
        System.out.println(pageNumString);
        for(int i = 0; i < users.length; i++ )
        {
            for(String entry : users[i].split(" "))
            {
                if(entry.equals(pageNumString))
                {
                    userCount++;
                    break;
                }   
            }
    }
    if(userCount > Integer.parseInt(num)){
        return false;
    }
    else{
        return true;
    }
    }
    }
public float query2(String pageName){
    int userCount = 0;
    int pageNum = convert(pageName);
    String pageNumString = Integer.toString(pageNum);
    for(int i = 0; i < users.length; i++ )
    {
        for(String entry : users[i].split(" "))
        {
            if(entry.equals(pageNumString))
            {
                userCount++;
                break;
            }   

        }
    }
    float percentage = (userCount*100.0f)/users.length;
    return percentage;  
}
public boolean query3(String pageName, String pageName2){
    int userCount1 = 0;
    int userCount2 = 0;
    String pageNumString = Integer.toString(convert(pageName));
    String pageNumString2 = Integer.toString(convert(pageName2));
    for(int i = 0; i < users.length; i++ )
    {
        for(String entry : users[i].split(" "))
        {
            if(entry.equals(pageNumString))
            {
                userCount1++;
                break;
            }   
        }
        for(String entry : users[i].split(" "))
        {
            if(entry.equals(pageNumString2))
            {
                userCount2++;
                break;
            }   
        }
    }
    return userCount1 > userCount2;

}
public int query4(String pageName, int numTimes){
    int userCount = 0;
    String pageNumString = Integer.toString(convert(pageName));
    for(int i = 0; i < users.length; i++ )//runs through each user
    {   int pageCount = 0;
        for(String entry : users[i].split(" "))// runs through each user's pages
        {
            if(entry.equals(pageNumString))
            {
                pageCount++;                // each time page is found page count increments 1
            }   
        }                                  // once done running through user's pages
        if(pageCount == numTimes){         // check if the number of pages is equal to the number given
            userCount++;                   // if so increment userCount
        }
    }
    return userCount;
}
public float query5(String pageName, String pageName2){
    int viewedMore = 0;
    int userCount1 = 0;
    int userCount2 = 0;
    String pageNumString = Integer.toString(convert(pageName));
    String pageNumString2 = Integer.toString(convert(pageName2));
    for(int i = 0; i < users.length; i++ )
    {
        for(String entry : users[i].split(" ")){
            userCount1 = 0;
            userCount2 = 0;
            if(entry.equals(pageNumString))
            {
                userCount1++;
                break;
            }   
        }
        for(String entry : users[i].split(" "))
        {
            if(entry.equals(pageNumString2))
            {
                userCount2++;
                break;
            }   
        }
        if(userCount1 > userCount2){
            viewedMore++;
        }
    }
    return viewedMore*100.0f/users.length;  
}
public boolean查询1(String num,String pageName){
如果(num==null){
返回false;
}
其他的
{
int userCount=0;
int pageNum=转换(页面名称);
系统输出打印项次(pageNum);
字符串pageNumString=Integer.toString(pageNum);
System.out.println(pageNumString);
for(int i=0;iInteger.parseInt(num)){
返回false;
}
否则{
返回true;
}
}
}
公共浮点查询2(字符串pageName){
int userCount=0;
int pageNum=转换(页面名称);
字符串pageNumString=Integer.toString(pageNum);
for(int i=0;iuserCount2;
}
公共整数查询4(字符串pageName,整数时间){
int userCount=0;
字符串pageNumString=Integer.toString(转换(pageName));
for(int i=0;iuserCount2){
viewedMore++;
}
}
返回viewedMore*100.0f/users.length;
}

至少,在
query3
query5
中,您可以为两个内部for循环中的每一个生成线程;没有理由必须按顺序运行它们。对于任何查询函数,您都可以将数组拆分为多个部分。由于数据越来越大,这种方法很可能比使用主线程迭代数据更快

我建议提供线程连续段(例如索引0到N-1;N到N+N-1等)。前面这一点很好地说明了为什么这种方法最有效。一旦你得到了一些工作,你可以玩的线程数量进行优化

编辑下面的评论 一种方法是实现,这样每个查询都可以在客户端之间互换,其中
executeQuery()
调用是接口方法。想象一下让客户的电话看起来像

interface Query {
    boolean executeQuery();
}

// client code...
Client client = new Client(...);
client.setQuery(new Query3(String num, String pageNum));
client.query(); // calls query.executeQuery();
在具体的
Query
类中,您可以定义线程将执行的各个行为。这是一个粗略的例子:

public Query3 implements Query { 
    Query3(String pageNum`, String pageNum2) {
        this.pageNum1=pageNum1;
        this.pageNum2=pageNum2;
    }

    boolean executeQuery() {
        for(int i = 0; i < users.length; i++ ) {
            SearchThread first = new SearchThread(pageNum1);
            SearchThread second = new SearchThread(pageNum2);
            first.run();
            second.run();
        }
        first.join();
        second.join();
        return first.userCount > second.userCount;
   }

SearchThread extends Thread {
    String pageNumString;
    int userCount;
    SearchThread(String pageNumString) {
        this.pageNumString=pageNumString;
    }
    public void run() {
        // do your search over this segment of the array, adding up userCounts
    }
publicquery3实现了