簡體   English   中英

使用同一實例從另一個線程訪問同步方法

[英]Access synchronized method from another thread using same instance

我在我的項目中有一個核心方法,我需要對其進行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秒,所以,我必須啟動該單獨的線程是線程tworun_loop方法。

放一些可以編譯和工作的東西。 我不明白為什么需要同步此功能。 檢查該程序的輸出...第二個線程僅在第一個線程完成訪問后才訪問此方法(除非您錯過添加一些其他代碼的情況)。

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();
   }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM