cari

Rumah  >  Soal Jawab  >  teks badan

Java如何实现一个方法只能被同一个线程调用一次?

如题。Java 如何实现一个方法只能被同一个线程调用一次 ,同一个线程调用第二次的时候可以抛异常。

阿神阿神2887 hari yang lalu538

membalas semua(3)saya akan balas

  • 迷茫

    迷茫2017-04-18 10:32:00

    Gunakan Set untuk menyimpan ID Thread yang telah memanggil kaedah ini Sebelum memasuki kaedah, tentukan dahulu sama ada ID thread semasa sudah disertakan dalam Set:

    private final Set<Long> THREADS = new HashSet<>();
    
    public void someMethod () {
        if (THREADS.contains(Thread.currentThread().getId())) {
            throw new RuntimeException("该线程不能再调用这个方法");
        }
        THREADS.add(Thread.currentThread().getId());
    
        // 方法内容
    }

    balas
    0
  • PHPz

    PHPz2017-04-18 10:32:00

    Thread.getCurrentThread.getId()

    balas
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:32:00

    Sesuaikan kelas Thread
    Tambahkan ahli boolean pada Thread tersuai untuk pertimbangan

    Contoh

    Utama kelas awam
    {
    utama kekosongan statik awam(String[] args)

    {
        new MyThread(new Runnable()
        {
                @Override
                public void run()
                {
                    test();
                    test();
                    test();
                    test();
                }
        }).start();
        
    }
    
    public static void test()
    {
        Thread t = Thread.currentThread();
        if ( !(t instanceof MyThread) || ((MyThread)t).isTestInvoked() )
            return ;
        
        System.out.println("Method test invoked !");
    }
    
    public static class MyThread extends Thread
    {
        public MyThread(Runnable r)
        {
            super(r);
        }
    
        public MyThread()
        {
            super();
        }
    
        public boolean isTestInvoked()
        {
            boolean result = methodTestInvoked;
            methodTestInvoked = true;
            return result;
        }
    
        private boolean methodTestInvoked = false;
    }

    }

    Jalankan keputusan
    Ujian kaedah digunakan !

    Lain-lain

    Anda juga boleh menggunakan ThreadLocal untuk menyelesaikannya

    balas
    0
  • Batalbalas