recherche

Maison  >  Questions et réponses  >  le corps du texte

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

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

阿神阿神2888 Il y a quelques jours548

répondre à tous(3)je répondrai

  • 迷茫

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

    Utilisez Set pour enregistrer l'ID du Thread qui a appelé cette méthode. Avant de saisir la méthode, déterminez d'abord si l'ID du thread actuel est déjà inclus dans le 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());
    
        // 方法内容
    }

    répondre
    0
  • PHPz

    PHPz2017-04-18 10:32:00

    Thread.getCurrentThread.getId()

    répondre
    0
  • 巴扎黑

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

    Personnaliser une classe Thread
    Ajouter un membre booléen au Thread personnalisé pour jugement

    Exemple

    classe publique Main
    {
    public static void main(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;
    }

    }

    Exécuter les résultats
    Méthode de test invoquée !

    Autres

    Vous pouvez également utiliser ThreadLocal pour le résoudre

    répondre
    0
  • Annulerrépondre