-2

我对程序运行的分析,但它不是那样发生的::

-我在 main 方法中创建了 2 个线程,即 Child1 和 Child2。

- 然后启动了两个线程

-Child1 作为单独的线程进入 run() 方法并进入同步块并打印 1 并由于调用了 wait 方法而休眠。

-Child2 作为单独的线程进入 run() 方法并进入同步块并打印 1 并通知 Child1 唤醒。

- 这个过程持续到 5

package multi_threading;

public class inter_thread implements Runnable {
    static inter_thread obj;
    boolean val=false;
    Thread t;

    public inter_thread(){}
    public inter_thread(String msg){
        t=new Thread(obj,msg);
        t.start();
    }
    public static void main(String args[]){
        obj=new inter_thread();
        inter_thread obj1=new inter_thread("Child1"); 
        inter_thread obj2=new inter_thread("Child2");
        try{
            obj1.t.join();
            obj2.t.join();
        }catch(InterruptedException e){
            System.out.println("Interrupted");
        }
    }

    public void run(){
        int i;
        synchronized(obj){
        for(i=1;i<=5;i++){
            System.out.println(i);
            val=!val;
            while(val)
                try{
                    wait();
                }catch(InterruptedException e){
                    System.out.println("Interrupted");
            }
            notify();
        }
     }
    }

}

我想使用多线程显示这样的输出::

1
1
2
2
3
3
4
4
5
5

输出::

1
1
2

谁能告诉我是什么问题??

EDIT2::我已经编辑了之前的代码

4

2 回答 2

0

Thread t;未初始化。

System.out.println(t.getName()+" has "+i);// 你会在这里得到异常

于 2013-11-05T15:34:14.767 回答
0

- 由于每个线程都有一个 obj 的副本,我刚刚得到

1
1
2

作为输出

--我修改了程序,使线程 Child1 和 Child2 共享对象。

package multi_threading;

 public class inter_thread {
    Thread t;
    public inter_thread(test_value obj,String msg){
        t=new Thread(obj,msg);
        t.start();
    }

}

 class test_value implements Runnable{
     boolean val=false;
    public static void main(String args[]){
        test_value obj=new test_value();
        inter_thread obj1=new inter_thread(obj,"Child1"); 
        inter_thread obj2=new inter_thread(obj,"Child2");
        try{
            obj1.t.join();
            obj2.t.join();
        }catch(InterruptedException e){
            System.out.println("Interrupted");
        }
    }
    public void run(){
        int i;
        synchronized(obj){
        for(i=1;i<=5;i++){
            System.out.println(i);
            obj.val=!obj.val;
            while(obj.val)
                try{
                    wait();
                }catch(InterruptedException e){
                    System.out.println("Interrupted");
                }
               notify();
           }
       }
    }
 }

- 我收到一个编译错误,提示无法解析 obj。

-如何使obj在线程之间共享以及如何产生如下输出:

1
1
2
2
3
3
4
4
5
5
于 2013-11-06T15:28:09.433 回答