Java 线程同步。以正确的方式打印值
我找不到这个问题的解决办法。我在某一点上搞砸了,但不确定。请给出克服这一问题的建议 问题: 有三个数组,每个数组都分配给线程,输出应该按顺序 t1={1,4,7} t2={2,5,8} t3={3,6,9} 预期产量 out={1,2,3,4,5,6,7,8,9} 我尝试了什么:Java 线程同步。以正确的方式打印值,java,multithreading,Java,Multithreading,我找不到这个问题的解决办法。我在某一点上搞砸了,但不确定。请给出克服这一问题的建议 问题: 有三个数组,每个数组都分配给线程,输出应该按顺序 t1={1,4,7} t2={2,5,8} t3={3,6,9} 预期产量 out={1,2,3,4,5,6,7,8,9} 我尝试了什么: public class Worker extends Thread { Worker next; int[] val; Object lock = new Object(); Wor
public class Worker extends Thread {
Worker next;
int[] val;
Object lock = new Object();
Worker(int[] val) {
this.val = val;
}
public void setnext(Worker next) {
this.next = next;
}
@Override
public void run() {
for (int i = 0; i < val.length; i++) {
synchronized (this) {
synchronized (next) {
System.out.println(val[i]);
next.notify();
}
synchronized (this) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
synchronized(next){
next.notify();
}
}
}
}
试试我的版本。请注意,等待应始终用于循环中
public class Worker extends Thread {
int[] val;
Worker next;
boolean ready;
boolean go;
Worker(int[] val) {
this.val = val;
}
public void setNext(Worker next) {
this.next = next;
}
@Override
public void run() {
synchronized (Worker.class) {
ready = true;
Worker.class.notifyAll();
for (int i = 0; i < val.length; i++) {
try {
while (!go) {
Worker.class.wait();
}
System.out.println(val[i]);
go = false;
next.go = true;
Worker.class.notifyAll();
} catch (InterruptedException e) {
}
}
}
}
public static void main(String[] args) throws Exception {
Worker worker1 = new Worker(new int[] { 1, 4, 7 });
Worker worker2 = new Worker(new int[] { 2, 5, 8 });
Worker worker3 = new Worker(new int[] { 3, 6, 9 });
worker1.setNext(worker2);
worker2.setNext(worker3);
worker3.setNext(worker1);
worker1.start();
worker2.start();
worker3.start();
synchronized (Worker.class) {
while(!worker1.ready || !worker2.ready ||!worker3.ready ) {
Worker.class.wait();
}
worker1.go = true;
Worker.class.notifyAll();
}
}
}
试试我的版本。请注意,等待应始终用于循环中
public class Worker extends Thread {
int[] val;
Worker next;
boolean ready;
boolean go;
Worker(int[] val) {
this.val = val;
}
public void setNext(Worker next) {
this.next = next;
}
@Override
public void run() {
synchronized (Worker.class) {
ready = true;
Worker.class.notifyAll();
for (int i = 0; i < val.length; i++) {
try {
while (!go) {
Worker.class.wait();
}
System.out.println(val[i]);
go = false;
next.go = true;
Worker.class.notifyAll();
} catch (InterruptedException e) {
}
}
}
}
public static void main(String[] args) throws Exception {
Worker worker1 = new Worker(new int[] { 1, 4, 7 });
Worker worker2 = new Worker(new int[] { 2, 5, 8 });
Worker worker3 = new Worker(new int[] { 3, 6, 9 });
worker1.setNext(worker2);
worker2.setNext(worker3);
worker3.setNext(worker1);
worker1.start();
worker2.start();
worker3.start();
synchronized (Worker.class) {
while(!worker1.ready || !worker2.ready ||!worker3.ready ) {
Worker.class.wait();
}
worker1.go = true;
Worker.class.notifyAll();
}
}
}
向我们展示您尝试的代码添加了我尝试的代码。。感觉很混乱,所以我没有在前面添加..你打算用这段代码做什么?有很多其他的方法可以输出sequence@Spring.Rush好啊这是一个面试问题。。你能说。。还有什么其他方法可以做到这一点。如果您还没有,请阅读有效Java SE中的第68项和第69项。向我们展示您尝试过的代码添加了我尝试过的代码。。感觉很混乱,所以我没有在前面添加..你打算用这段代码做什么?有很多其他的方法可以输出sequence@Spring.Rush好啊这是一个面试问题。。你能说。。还有其他方法吗?如果您还没有,请阅读有效Java SE中的第68项和第69项。
1
2
3
4
5
6
7
8
9