请教大家一个问题题目:
子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
程序如下:
public class ThreadTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
new ThreadTest().init();
}
public void init() {
final Business business = new Business();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 50; i++) {
business.SubThread(i);
}
}
}
).start();
for (int i = 0; i < 50; i++) {
business.MainThread(i);
}
}
private class Business {
boolean bShouldSub = true;// 这里相当于定义了控制该谁执行的一个信号灯
public synchronized void MainThread(int i) {
if (bShouldSub)
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int j = 0; j < 5; j++) {
System.out.println(Thread.currentThread().getName() + ":i=" + i
+ ",j=" + j);
}
bShouldSub = true;
this.notify();
}
public synchronized void SubThread(int i) {
if (!bShouldSub)
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int j = 0; j < 10; j++) {
System.out.println(Thread.currentThread().getName() + ":i=" + i
+ ",j=" + j);
}
bShouldSub = false;
this.notify();
}
}
}问题1、进入 SubThread方法的this.notify不是说去唤醒一个等待的线程吗?这时不是还没有线程wait()了,为啥先唤醒而不是先wait呢?
问题2、SubThread的 if (!bShouldSub)这块什么时候进入,还有 MainThread方法的 if (bShouldSub)块什么时候进入初学 十分感谢各位!!多线程threadnotify
子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
程序如下:
public class ThreadTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
new ThreadTest().init();
}
public void init() {
final Business business = new Business();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 50; i++) {
business.SubThread(i);
}
}
}
).start();
for (int i = 0; i < 50; i++) {
business.MainThread(i);
}
}
private class Business {
boolean bShouldSub = true;// 这里相当于定义了控制该谁执行的一个信号灯
public synchronized void MainThread(int i) {
if (bShouldSub)
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int j = 0; j < 5; j++) {
System.out.println(Thread.currentThread().getName() + ":i=" + i
+ ",j=" + j);
}
bShouldSub = true;
this.notify();
}
public synchronized void SubThread(int i) {
if (!bShouldSub)
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int j = 0; j < 10; j++) {
System.out.println(Thread.currentThread().getName() + ":i=" + i
+ ",j=" + j);
}
bShouldSub = false;
this.notify();
}
}
}问题1、进入 SubThread方法的this.notify不是说去唤醒一个等待的线程吗?这时不是还没有线程wait()了,为啥先唤醒而不是先wait呢?
问题2、SubThread的 if (!bShouldSub)这块什么时候进入,还有 MainThread方法的 if (bShouldSub)块什么时候进入初学 十分感谢各位!!多线程threadnotify
子线程被start()语句“启动”后,并不是立刻得到CPU开始执行。“启动”仅仅代表一种“就绪”的状态,只是表明它已经可以执行了。但具体何时开始执行取决于Java虚拟机的调度。因此可能出现以下两种情况:情况一:子线程还未真正开始执行,主线程继续执行,到了business.MainThread(i);这句。由于bShouldSub的初始值为true,所以主线程执行到了this.wait(),阻塞在这里,等待子线程执行。由于!bShouldSub此时为false,所以子线程不会执行this.wait(),循环打印10句话后,用notify()将主线程唤醒。子线程下次进入SubThread()方法,由于!bShouldSub此时为true,所以子线程用wait()将自己阻塞起来,等待主线程唤醒它。情况二:在主线程执行到business.MainThread(i);之前,子线程已经开始执行了,!bShouldSub为false,因此子线程打印10句话后使用notify()来唤醒主线程。但此时主线程还没有被wait()阻塞,所以这句notify()并没有起什么作用。子线程下一次进入SubThread()方法时,由于bShouldSub已经改变,因此子线程阻塞,等待主线程执行到notify()时唤醒子线程。