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