我该如何创建一个线程来锁定前夫的前半部分,而第二个线程则搜索后半部分?

时间:2019-11-14 18:04:14

标签: java multithreading

我做了一个我不知道如何搜索的项目的数组列表,分为搜索过程。我想分配一个线程来搜索前半部分,而第二个线程来搜索后半部分。对于输出(如果名称在前半部分中存在),我希望计算机返回名称的布尔值(如果找到)以及找到的位置。例如,线程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"));
}

}

1 个答案:

答案 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框架以及执行程序池。