所以我有一个线程用另一个随机字符替换字符数组中的最小字符。线程一直运行,直到数组只包含'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");
}
}
正如您所看到的,输出通常具有不同的长度,我不确定是什么导致它
答案 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
+一个\n
(println()
),然后第一个结束了他正在做的事情,然后打印其余部分: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();
}
}
}