【发布时间】:2015-06-07 19:36:08
【问题描述】:
我是 MultiThreading 的新手,我正在编写一个应用程序,因为我有两个线程 T1 和 T2。 在 T1 我有 15 条要打印的语句,而 T2 我有 15 条要打印的语句。 我喜欢在 T1 执行语句 5 后等待 T2 一段时间,并在 T1 执行语句 10 后继续 T2。 我已经写了代码,但是 T2 没有等待,谁能解释一下。
线程一:T1
public class ThreadOne extends Thread {
public void run() {
for (int i = 1; i <= 15; i++) {
System.out.println("This is Thread One " + i);
if (i == 5) {
synchronized (Test.threadB) {
try {
Test.threadB.wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
} else if (i == 10) {
synchronized (Test.threadB) {
Test.threadB.notify();
}
}
}
}
}
线程二:T2
public class ThreadTwo extends Thread {
public void run() {
for (int i = 1; i <= 15; i++) {
System.out.println("This is Thread Two " + i);
}
}
}
测试:
public class Test {
static Thread threadA = null;
static Thread threadB = null;
public static void main(String[] args) throws InterruptedException {
threadA = new ThreadOne();
threadB = new ThreadTwo();
threadA.start();
threadB.start();
}
}
我对 O/P 的期望:
T1 执行后 Test.threadB.wait();当 i 为 5 时,无需打印 T2 语句。 T1 i 为 10 后,T2 可以开始打印。
但我得到的 O/p 是:
This is Thread One 1
This is Thread One 2
This is Thread One 3
This is Thread Two 1
This is Thread Two 2
This is Thread One 4
This is Thread Two 3
This is Thread One 5
This is Thread Two 4
This is Thread Two 5
This is Thread Two 6
This is Thread Two 7
This is Thread Two 8
This is Thread Two 9
This is Thread Two 10
This is Thread Two 11
This is Thread Two 12
This is Thread Two 13
This is Thread Two 14
This is Thread Two 15
This is Thread One 6
This is Thread One 7
This is Thread One 8
This is Thread One 9
This is Thread One 10
This is Thread One 11
This is Thread One 12
This is Thread One 13
This is Thread One 14
This is Thread One 15
为什么只有 T2 语句在 T1 i==5 或(这是线程一 5 被打印)之后执行?请任何人解释一下。
【问题讨论】:
-
你认为
Test.threadB.wait();做了什么,你为什么这么认为? -
我希望 T2 等待你认为
Test.threadB.wait();为何能做到这一点? -
并不是说它可以解决任何问题,但您应该避免扩展线程。而是为
Runnable创建实现并将其传递给线程。还要避免在 Thread 上同步。 -
导致当前线程调用
Test.threadB.wait();时是哪个当前线程? -
开始区分线程和
Thread对象。Thread#start()启动一个由对应的Thread对象标识的线程。代码正在该(当前)线程中执行,并在某些时候调用Test.threadB.wait()。当前线程是什么?
标签: java multithreading wait