下面这个程序结果为什么和预期的不一样
public class test
{
static Object lock=new Object();
public static void main(String args[]) {
for(int i=0;i<3;i++){
work o= new work(i);
o.start();
}
synchronized (lock) {
lock.notifyAll();
}
}
static class work extends Thread{
private int i;
public work(int i){
this.i=i;
}
public void run(){ synchronized(lock){
try {
lock.wait();
}
catch (InterruptedException ex) {
}
String str="测试";
for(int i=0;i<3;i++){
System.out.println(this.i + " "+i+" :" + str);
}
}
}
}
}
运行结果:
1 0 :测试
1 1 :测试
1 2 :测试
0 0 :测试
0 1 :测试
0 2 :测试
只有0号和1号线程的结果输出为什么没有2号的??
public class test
{
static Object lock=new Object();
public static void main(String args[]) {
for(int i=0;i<3;i++){
work o= new work(i);
o.start();
}
synchronized (lock) {
lock.notifyAll();
}
}
static class work extends Thread{
private int i;
public work(int i){
this.i=i;
}
public void run(){ synchronized(lock){
try {
lock.wait();
}
catch (InterruptedException ex) {
}
String str="测试";
for(int i=0;i<3;i++){
System.out.println(this.i + " "+i+" :" + str);
}
}
}
}
}
运行结果:
1 0 :测试
1 1 :测试
1 2 :测试
0 0 :测试
0 1 :测试
0 2 :测试
只有0号和1号线程的结果输出为什么没有2号的??
JDK版本是1.6.0_02
但是和程序的初衷就不一样了,lock.wait()是为了无限期等待,只有外界唤醒才可以运行
public class test
{
static Object lock=new Object();
public static void main(String args[]) {
for(int i=0;i <3;i++){
work o= new work(i);
o.start();
}
synchronized (lock) {
lock.notifyAll();//唤醒线程
}
}
static class work extends Thread{
private int i;
public work(int i){
this.i=i;
}
public void run(){ synchronized(lock){
try {
lock.wait();//线程等待,但是由于wait会释放掉持有的锁。所以其他线程也可以进入方法,等待。
}
catch (InterruptedException ex) {
}
String str="测试";
for(int i=0;i <3;i++){
System.out.println(this.i + " "+i+" :" + str);
}
}
}
}
}
你这段代码问题很多啊。
假设
synchronized (lock) {
lock.notifyAll();//唤醒线程
}
执行过后,
线程1被唤醒,则出现 线程1的打印信息。但由于那一次lock.notifyAll();只唤醒了线程1,
而其他线程还在无锁的状态中等待,
所以一直走不下去。
因为你在 run 方法里,没有再次在lock上等待的线程。
所以就一直等待,程序不会结束,也不会向下继续走。
我觉得只打印出1个线程的信息的可能性也是很大的啊,
你可以多试几次
就是任何一个线程的信息都打印不出来的。这样改一下:public class test {
static Object lock = new Object(); public static void main(String args[]) {
for (int i = 0; i < 3; i++) {
work o = new work(i);
o.start();
}
try {
Thread.sleep(100);//确保线程都处于等待状态下的时候,再执行lock.notifyAll();,否则的话
//有可能先调用了lock.notifyAll();,但是线程0,1,2还没有起动去执行run方法呢。
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock) {
lock.notifyAll();
}
} static class work extends Thread {
private int i; public work(int i) {
this.i = i;
} public void run() { synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException ex) {
}
String str = "ceshi";
for (int j = 0; j < 3; j++) {
System.out.println(this.i + " " + j + " :" + str);
}
lock.notify();
}
}
}
}