生成,转换和计数频率的线程

时间:2019-08-14 11:43:21

标签: java multithreading

我想创建3个线程:一个线程生成一个随机字符串,一个线程将该字符串转换为小写字母,另一个线程计算该字符串中单词的出现频率。

我已经使用Generator之类的构造函数创建了ConvertFreq(int[] buffer, Semaphore mutex, Semaphore items, Semaphore spc)。我创建了一个Start类:

public class Start
{
    static int first = 0;
    static ind last = 0;
}

带有信号灯mutexitemsspc

这是我的run类的Generator方法。它可以正常工作,并生成长度为15的随机大写字符串。

public void run()
{
    Random rand = new Random();
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int size = 15;

    while (true)
    {
        try 
        {
            char[] res = new char[size];

            for (int i = 0; i < size; i++)
            {
                res[i] = alphabet.charAt(rand.nextInt(alphabet.length()));
            }

            System.out.println("String generated: " + String.valueOf(res));

            spc.acquire();
            mutex.acquire();

            // buffer[Start.last] = res[0];
            Start.last = (Start.last + 1) % 100;

            mutex.release();
            items.release();

            Thread.sleep(4000);
        } 

        catch (InterruptedException e) 
        {
            e.printStackTrace();
        }
    }
}

我的问题是:如何制作ConvertFreq来读取数组?我知道如何转换为小写(当然)并计算数组中每个字母的频率。我已经使用runitems.acquire();为两个类创建了mutex.acquire()方法,但是似乎没有任何作用。

感谢您为我提供帮助的时间^^

1 个答案:

答案 0 :(得分:0)

当我对您的理解正确时,您希望运行Generator线程生成字符串,运行Convert线程转换生成的字符串,运行Freq线程分析转换后的字符串。

由于所有三个线程都需要从其他线程读取结果,因此应将这些数据保存在上级类/方法中。您可以创建三个集合,例如newStringsconvertedStringsfrequencies。您的Generator线程将创建字符串并将其添加到newStrings集合中。您的Convert线程会查看newStrings集合,并从中获取一个新字符串(通过删除所有旧字符串或计算索引),将其转换并将其添加到convertedStrings集合中。然后,您的Freq线程再次从convertedStrings集合中获取一个新的转换后的String,计算该字符串中单词的出现频率,并将结果添加到frequencies集合中。