修改多个线程的数组

时间:2017-11-23 14:34:18

标签: java multithreading

所以我有一个线程用另一个随机字符替换字符数组中的最小字符。线程一直运行,直到数组只包含'z'。但是,当我创建多个线程时,我会得到奇怪的输出,我想知道它是打印的唯一问题,或者我的代码实际上是否存在。

我的帖子中的

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <div class="wrap"> <input type="text" id="first" class="input" data-dropdown="#add_new_type"> <ul id="new-types" style="display: none" class="dd_items"> <li data-id="1" class="choose_val dd_items__item">Sirst value</li> <li data-id="2" class="choose_val dd_items__item">Second value</li> </ul> </div> <div class="wrap"> <input type="text" id="first" class="input" data-dropdown="#add_new_type"> <ul id="new-types" style="display: none" class="dd_items"> <li data-id="1" class="choose_val dd_items__item">Sirst value</li> <li data-id="2" class="choose_val dd_items__item">Second value</li> </ul> </div>方法:

run()

我的主要人物:

public void run() {
    char[] expected = { 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z' };
    while (timesModified < 100 && !Arrays.equals(array, expected)) {
        try {
            array[findMinIndex(array)] = rndChar();
            timesModified++;
            Thread.sleep(2000);
            for (char c : array) {
                System.out.print(c + " ");
            }
            System.out.println();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

来自控制台的输出:

public static void main(String[] args) {
        char[] sa_table = new char[10];
        Arrays.fill(sa_table, 'a');
        Thread t = new Thread(new AddToTable(sa_table));
        Thread t1 = new Thread(new AddToTable(sa_table));
        Thread t2 = new Thread(new AddToTable(sa_table));
        t.start();
        t1.start();
        t2.start();
        try {
            t.join();
            t1.join();
            t2.join();
        } catch (Exception e) {
            System.out.println("Interrupted");
        }
    }

正如您所看到的,输出通常具有不同的长度,我不确定是什么导致它

3 个答案:

答案 0 :(得分:2)

你的问题来自:

  for (char c : array) {
       System.out.print(c + " ");
  }
  System.out.println();

此循环可以在一个线程的中间位置暂停,然后从另一个线程开始,因此在调用println()之前,您可以打印两个混合的线程。

例如,当你有:

n n u o S u s x l v r 
u o D u s x l v r 

这意味着你有这个字符串:n u o S u s x l v r,一个线程开始打印它,它打印n,然后另一个接管,打印所有 - &gt; n n u o S u s x l v r +一个\nprintln()),然后第一个结束了他正在做的事情,然后打印其余部分:u o D u s x l v r

答案 1 :(得分:0)

好像你正面临着#Mut;排除&#34;或&#34; Mutex&#34;问题在这里:

https://en.wikipedia.org/wiki/Mutual_exclusion

您必须确保多个线程不会同时编辑该数组。

答案 2 :(得分:0)

在不查看代码以检查它是否正确执行实际任务的情况下,变化长度的答案很简单: 三个线程同时打印出值,因此您不知道哪个线程打印出哪个值。

例如,这些行:

u u u u C t u s x t v w 
u T u T t u s x t v w 
t u s x t v w 

由三个线程打印。这就是为什么值的总数是正确的,换行符的数量也是正确的(3)。尝试以包含每个值的线程ID的方式进行打印,并且您将看到每次每个线程都没有获得一行,而是每个参与线程的值和换行符的混合。

为避免这种情况,您可以使用StringBuilder来组合每个线程的值,然后一次打印出来。

试试这个:

    public void run() {
    char[] expected = { 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z' };
    while (timesModified < 100 && !Arrays.equals(array, expected)) {
        try {
            array[findMinIndex(array)] = rndChar();
            timesModified++;
            Thread.sleep(2000);
            StringBuilder sb = new StringBuilder();
            for (char c : array) {
                sb.append(c + " ");
            }
            System.out.println(sb);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}