【发布时间】:2014-07-11 11:06:51
【问题描述】:
我的 java 程序中有两个线程,一个是主线程,另一个线程是在主线程中产生的线程 A。现在我希望主线程启动线程 A 并等待线程 A 在 run 方法中执行了它的部分代码,并且线程 A 应该挂起自己。然后主线程应该开始运行,运行几行代码,然后线程 A 应该从它停止的地方开始,反之亦然。这应该发生 n 次。 我正在尝试如下:
线程A类:
public class ThreadA implements Runnable {
boolean suspended = false;
boolean stopped = false;
synchronized void stop() {
stopped = true;
suspended = false;
notify();
}
synchronized void suspend() {
suspended = true;
}
synchronized void resume() {
suspended = false;
notify();
}
void job() throws InterruptedException {
for (int i = 0; i < 5; i++)
synchronized (this) {
System.out.println("performing job.");
suspend();
while (suspended) {
notify();
suspended = false;
}
}
}
@Override
public void run() {
try {
job();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
主线程:
public class MainThread {
public static void main(String[] args) throws InterruptedException {
ThreadA a1=new ThreadA();
Thread t1=new Thread(a1);
synchronized (t1) {
t1.start();
for (int i = 0; i < 5; i++) {
t1.wait();
System.out.println("perform some action");
a1.resume();
}
}
}
}
预期输出:
performing job.
perform some action
performing job.
perform some action
performing job.
perform some action
performing job.
perform some action
performing job.
perform some action
实际输出:
performing job.
performing job.
performing job.
performing job.
performing job.
perform some action
我不知道为什么整个 for 循环会在线程 A 中执行,即使我在作业方法中发出了 notify() 信号。
【问题讨论】:
-
如果不是为了教育,你为什么要运行2个线程,一个接一个地执行?你可以只用 1 个线程做同样的事情
-
旁注:您在不同的对象上同步两个线程,因此
synchronized语句毫无用处。 -
您期望完全随机吗?还是一步一步的行动作业行动作业?
-
@coreJavare
suspend()是这里的自定义方法。 -
如果一个线程只是要等待另一个线程,那么拥有两个线程有什么意义?
标签: java multithreading