使用相同实例从另一个线程访问同步方法

时间:2016-03-06 14:45:58

标签: java multithreading synchronized data-synchronization

我的项目中有一个核心方法,我需要它synchronized,以便不能同时访问两次,因此我有一个线程使用此类中的实例来访问这个方法,但是在这个线程中我需要有一个长寿命循环来用于访问具有固定值的相同方法,所以我必须使用另一个线程以允许第一个线程继续前进并完成它的职责,但是确保该方法不使用第一个线程中使用的相同实例从第二个线程运行,并且我不能以某种方式从类中实例化另一个实例,因为我必须完全使用此实例,因此如何克服此问题。

下面是转换为java的问题:

public class ClassOne {
    synchronized public void my_method(int number) {
        // Do some Work
    }
}

public class ClassTwo {

    private void some_method() {
        Thread one = new Thread(new Runnable() {
            @Override
            public void run() {
                ClassOne class_one = new ClassOne();
                // DO Work
                class_one.my_method(0);
                run_loop(class_one);
                // Complete Work
            }
        });
        one.start();
    }

    boolean running = true;

    private void run_loop(final ClassOne class_one) {
        Thread two = new Thread(new Runnable() {

            @Override
            public void run() {
                while (running) {
                    class_one.my_method(1); // won't run
                    Thread.sleep(10000);
                }
            }
        });
        two.start();
    }

}

实际问题概述:

  • my_method --->是发送UDP数据包。
  • 该方法必须同步,否则我会在尝试多次重复使用时让套接字已经打开异常。
  • 在某些时候,我必须每10秒重复发送一次 KeepAlive 消息,因此,我必须为two中的线程run_loop启动一个单独的线程方法。

1 个答案:

答案 0 :(得分:0)

放置可编译和工作的东西。我不明白为什么你需要同步这个功能。检查此程序的输出...第二个线程仅在第一个线程完成访问时访问此方法(除非您错过了添加一些其他代码)。

class ClassOne {    
   int criticalData = 1;
   synchronized public void my_method(int number) {
     // Do some Work
     criticalData *= 31;
     System.out.println("Critical data:" + criticalData + "[" + Thread.currentThread().getName() + "]");
   }
 }

class ClassTwo {       boolean running = true;

  public void some_method() {

    Thread one = new Thread(new Runnable() {
        public void run() {
            ClassOne class_one = new ClassOne();
            // DO Work
            class_one.my_method(0);
            run_loop(class_one);
            // Complete Work
        }
    });
    one.start();
}

public void run_loop(final ClassOne class_one) {
     Thread two = new Thread(new Runnable() {

        public void run() {
            while (running) {
                class_one.my_method(1); // won't run
                 try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
             }
         }
     });
     two.start();
   }
}

 public class StackExchangeProblem {
   public static void main(String[] args) {
     ClassTwo two = new ClassTwo();
     two.some_method();
   }
 }