0
  • 我写了一个程序来打印n o t i f y,所有字母都用制表符分隔。

  • 我使用了线程间通信,其中一个线程打印一个字母,然后另一个线程打印另一个,使用wait()and notify()

  • 我得到n o t了输出。怎么样i f y?为什么不打印?

代码:

package multi_threading; 

 public class test_value implements Runnable{
    static String name="notify";
    Thread t;
    static int len;
    boolean val=false;
    static int i;
    public test_value(){}
    public test_value(test_value obj,String msg){
        t=new Thread(obj,msg);
        t.start();
    }
    public static void main(String args[]){
        len=name.length();
        test_value obj=new test_value();
        new test_value(obj,"Child1"); 
        new test_value(obj,"Child2");
    }
    public void run(){
        synchronized(this){
          while(i<len){
          System.out.println("I got "+name.charAt(i));
          i++;
          val=!val;
          while(val){
              try{
                   wait();
                }catch(InterruptedException e){
                    System.out.println("Interrupted");
               }
           }
          notify();
        }
      }   
    }
 }
4

3 回答 3

0

你不仅只得到'n'、'o'和't',而且你的程序也没有结束...... :)

你需要while(val)改变if (val)

一切顺利,(调试是你的朋友)。此外,类名应该是“大写的驼峰式”。你的班级应该被称为TestValue而不是test_value

于 2013-11-08T15:55:51.590 回答
0

更好的是,你根本不需要 val 。

synchronized(this){
    while(i<len){
        System.out.println("I got "+name.charAt(i) + ", " + Thread.currentThread().getName());
        i++;    
        try{
            notify();
            wait();
        }catch(InterruptedException e){
            System.out.println("Interrupted");
        }
    }
}   

运行这个并得到输出:

I got n, Child2
I got o, Child1
I got t, Child2
I got i, Child1
I got f, Child2
I got y, Child1

通过使用接受的答案代码,我得到了输出:

I got n, Child1
I got o, Child2
I got t, Child2
I got i, Child1
I got f, Child1
I got y, Child2

这不是真正的交替线程,就像你想要的那样。这是因为 notify 实际上并没有放弃锁定。这只是意味着当你放弃锁时(当你等待时),你会让一个等待的线程知道轮到他们运行了。

于 2013-11-08T16:42:16.893 回答
-1

你的变量

boolean val=false;

不是静态的,所以每个线程都有自己的值,让它成为静态的

static boolean val=false;
于 2013-11-08T15:57:01.590 回答