我做了一个我不知道如何搜索的项目的数组列表,分为搜索过程。我想分配一个线程来搜索前半部分,而第二个线程来搜索后半部分。对于输出(如果名称在前半部分中存在),我希望计算机返回名称的布尔值(如果找到)以及找到的位置。例如,线程1找到了一个名称。常春藤存在
import java.util.ArrayList;
/* a class for storing a set of strings */
class Set {
/* items are stored in an ArrayList */
private ArrayList<String> items;
public Set() {
items = new ArrayList<String>();
}
/* add an item in */
public void add(String element) {
items.add(element);
}
/* check if an item exists TODO parallelize this process */
boolean exists(String element) {
for(int i = 0; i < items.size(); i++) {
/* if this is the item */
if(items.get(i).equals(element)) {
/* we found it */
return true;
}
}
/* didn't find it */
return false;
}
}
public class Search {
public static void main(String args[]) {
/* create a test set */
Set names = new Set();
/* add 100 random names */
names.add("Santiago");
names.add("Darcel");
names.add("Illa");
names.add("Myrta");
names.add("Greg");
names.add("Annabell");
names.add("Lonnie");
names.add("Ramona");
names.add("Pearl");
names.add("Jaqueline");
names.add("Winnifred");
names.add("Roland");
names.add("Alysa");
names.add("Hilda");
names.add("Jeanett");
names.add("Kimberly");
names.add("Annalee");
names.add("Deane");
names.add("Brittani");
names.add("Natacha");
names.add("Herta");
names.add("Giovanna");
names.add("Tressa");
names.add("Morton");
names.add("Ela");
names.add("Chante");
names.add("Melani");
names.add("Omega");
names.add("Roman");
names.add("Rashida");
names.add("Myles");
names.add("Devorah");
names.add("Luther");
names.add("Annette");
names.add("Tessa");
names.add("Darryl");
names.add("Thad");
names.add("Freda");
names.add("Laurence");
names.add("Asa");
names.add("Burma");
names.add("Lila");
names.add("Tierra");
names.add("Idell");
names.add("Ninfa");
names.add("Denae");
names.add("Randy");
names.add("Milan");
names.add("Karey");
names.add("Carter");
names.add("Arlette");
names.add("Estela");
names.add("Dacia");
names.add("Cory");
names.add("Leatrice");
names.add("Maura");
names.add("Tiana");
names.add("Billy");
names.add("Brittany");
names.add("Kendall");
names.add("Merri");
names.add("Liane");
names.add("Simone");
names.add("Hilaria");
names.add("Neely");
names.add("Jeromy");
names.add("Kiyoko");
names.add("Alta");
names.add("Lucien");
names.add("Patria");
names.add("Alphonso");
names.add("Jenae");
names.add("Sanda");
names.add("Suk");
names.add("Berry");
names.add("Terry");
names.add("Wei");
names.add("Milagros");
names.add("Adrianne");
names.add("Dusti");
names.add("Ivy");
names.add("Cyndi");
names.add("Quiana");
names.add("Ellyn");
names.add("Garnet");
names.add("Hipolito");
names.add("Eugena");
names.add("Laveta");
names.add("Eunice");
names.add("Arnulfo");
names.add("Luz");
names.add("Ranee");
names.add("Adolfo");
names.add("Leola");
names.add("Miguel");
names.add("Jacque");
names.add("Aja");
names.add("Kelsie");
names.add("Pamula");
names.add("Marcus");
/* test */
System.out.printf("%s exists: %b.\n", "Ivy", names.exists("Ivy"));
System.out.printf("%s exists: %b.\n", "Mark", names.exists("Mark"));
System.out.printf("%s exists: %b.\n", "Pearl", names.exists("Pearl"));
System.out.printf("%s exists: %b.\n", "Georgette", names.exists("Georgette"));
System.out.printf("%s exists: %b.\n", "Simone", names.exists("Simone"));
System.out.printf("%s exists: %b.\n", "Bobby", names.exists("Bobby"));
System.out.printf("%s exists: %b.\n", "Roland", names.exists("Roland"));
System.out.printf("%s exists: %b.\n", "Agatha", names.exists("Agatha"));
System.out.printf("%s exists: %b.\n", "Luz", names.exists("Luz"));
System.out.printf("%s exists: %b.\n", "Herman", names.exists("Herman"));
}
}
答案 0 :(得分:1)
创建一个实现Runnable的新类;它的参数(因此,在构造函数中设置的字段)是[1]列表,[2]是“范围”,即起点和终点。您的一个入门线程可以根据需要创建尽可能多的线程。在您的情况下,它将为2;它们都获得相同的列表,但是一个获得范围0-list.length()/ 2,另一个获得范围list.length()/ 2-list.length()。
然后,创建2个线程,每个线程都使用您创建的实例之一进行初始化。没关系,因为您的类实现了Runnable。
然后同时启动它们。
对于答案,您需要知道何时完成线程,并且还需要线程将答案传达给您。您可以使用yield()
方法冻结自己的线程,并等待它们完成,以确保它们全部完成。然后,您可以使用带有吸气剂的普通旧字段来查询每个创建的对象的答案,然后编写一些代码将这些答案结合在一起。
完成实验后,会出现各种框架,并以更简化的方式进行操作,您实际上只是将其简化为工作,如闭包/ lambda和简化函数所述将答案合并为一个答案;然后,框架负责触发适合您的CPU等的适当数量的线程。但是,这是一个很好的开始练习,可以大致了解这些框架的工作原理。这些框架可以在java.util.concurrent
包中找到,例如fork / join框架以及执行程序池。