gpt4 book ai didi

java - 线程间消息传递实现

转载 作者:行者123 更新时间:2023-11-30 05:53:50 25 4
gpt4 key购买 nike

我想做的是让一个线程将从其父线程接收到的消息写入一个 OutputStream,监听一个 InputStream 的回复,然后将回复通知父线程。我写了两个测试类,它们以不同的方式做类似但更简单的事情。方法 1 仅在 "before loop" 调试语句未注释时有效,方法 2 仅打印 "message from child" 调试语句。我做错了什么?

方法一

public class Parent {
private static int out = 0;
private static int in = 0;

public static void main(String[] args) {
final Object locker = new Object();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized (locker) {
try {
locker.wait();
System.out.println("Message from parent " + out);
in = out + 10;
locker.notify();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
});
t.start();

System.out.println("before loop");
while (out < 10) {
synchronized (locker) {
locker.notify();
try {
locker.wait();
out++;
System.out.println("Message from child " + in);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

方法二

public class Parent {

/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
final BlockingQueue<Integer> q = new ArrayBlockingQueue<Integer>(1);

Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Integer i = q.take();
System.out.println("Message from parent: " + i.intValue());
q.put(i.intValue() + 10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});

for (int i = 0; i < 10; i++) {
q.put(i);
Integer j = q.take();
System.out.println("Message from child: " + j);
}
}

}

最佳答案

Java API 已经提供了该功能;你有重新发明轮子的正当理由吗?

public static void main(String[] args) throws Exception {
// start a worker thread
ExecutorService exec = Executors.newFixedThreadPool(1);

// ask the worker thread to execute a task (
Future<String> future = exec.submit(() -> {
Thread.sleep(500); // simulate waiting for I/O
return "hello from child";
});

// get the return value from the worker thread (waiting until it is available)
String greeting = future.get();
System.out.println(greeting);

// terminate the worker thread (otherwise, the thread will wait for more work)
exec.shutdown();
}

关于java - 线程间消息传递实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10162615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com