0

-我想使用Java中的同步技术打印下面的输出

1
1
2
2
3
3
4
4
5
5

- 我写了下面的代码,但我得到一个编译时错误,说 obj 变量没有被引用

-obj 变量在 run 方法中的同步块中

-我创建了 2 个线程 Child1 和 Child2 并在它们之间共享 obj

-如何使 obj 对同步块可见,以便获得所需的输出?

package multi_threading;

public class inter_thread {
    boolean val=false;
    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();
        }
      }
    }
 }
4

2 回答 2

2

我认为最简单的方法是使用CyclicBarrier

public class SyncTask implements Runnable {
    private final CyclicBarrier barrier;

    public SyncTask(CyclicBarrier barrier) { this.barrier = barrier; }

    @Override
    public void run() {
        try {
            for (int i = 1; i <= 5; i++) {
                System.out.println(i);
                barrier.await();
            }
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(2);
        new Thread(new SyncTask(barrier)).start();
        new Thread(new SyncTask(barrier)).start();
    }
}

(请注意,这里的两个任务并不是真正交替的,而是并行运行的。但是这会CyclicBarrier迫使它们在每个任务之后相互等待System.out.println

于 2013-11-07T12:32:53.677 回答
0

试试这个……它对我有用!请为 while 循环添加括号并限制同步。

并获取obj,使其成为实例变量,以便run方法可以访问它

     class inter_thread {
    boolean val=false;
    Thread t;
    public inter_thread(test_value obj,String msg){
        t=new Thread(obj,msg);
        t.start();
    }
}
 public class test_value implements Runnable{
    boolean val=false;
    static test_value obj=new test_value();
    public static void main(String args[]){

        inter_thread obj1=new inter_thread(obj,"Child1"); 
        inter_thread obj2=new inter_thread(obj,"Child2");
    }
public void run(){
    int i;
       for(i=1;i<=5;i++){
       System.out.println(i);

       synchronized(obj){
        obj.val=!obj.val;
           while(obj.val){
                try{
                    wait();
                }catch(InterruptedException e){
                    System.out.println("Interrupted");
                }
           }
        notify();
        }
      }
    }
 }
于 2013-11-07T12:42:41.920 回答