Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中杀死队列中等待执行方法的线程_Java_Multithreading - Fatal编程技术网

如何在Java中杀死队列中等待执行方法的线程

如何在Java中杀死队列中等待执行方法的线程,java,multithreading,Java,Multithreading,我在main类中有一个公共方法,它将由主线程执行,在某些情况下还将由另一个线程执行。代码结构如下所示 class Main { public static void main(){ ...some code if(..on some condition) methodA() } public void methodA(){ synchronized(this){ ..some code } } }

我在main类中有一个公共方法,它将由主线程执行,在某些情况下还将由另一个线程执行。代码结构如下所示

class Main {
   public static void main(){
      ...some code
      if(..on some condition)
         methodA()
   }
   public void methodA(){
   synchronized(this){
        ..some code
     }
   }
}

class AnotherThread implements Runnable{
   public AnotherThread(){
       Main obj = new Main();
   }
   @Override
   public void run(){
        if(..on some condition)
            obj.methodA()
   }
}
此methodA()是同步的,如代码中所述。让我们假设两个线程中的条件的计算结果都为true,并且methodA()同时被调用。在这种情况下,无论哪个线程先出现,都将首先执行methodA()。但另一个线程处于等待状态,等待执行该方法。但是我想杀死那个线程,并将我的执行限制为一次(即,无论哪个线程先出现,都必须单独执行该方法,而不是另一个)

这可能吗。如果是这样的话,怎么做呢

提前谢谢

  • 您的代码将无法工作,因为您正在
    synchronized
    块中使用
    (对象级锁),并且两个线程都使用单独的对象,因此两个线程都将在不等待的情况下运行。 您可以使用类级锁,并在
    synchronized
    块中使用该锁,如下所示:

    private static final Object LOCK = new Object(); 
    
    public void methodA(){
        synchronized(LOCK){
         ..some code
       }
    }
    
    或者在两个线程中使用相同的对象

  • 您不能终止线程,您可以做的是在
    synchronized
    块中有一个信号量(或任何变量)和一个条件。检查是否设置了信号量,然后返回,否则在退出方法之前执行代码并设置信号量

    private static boolean condition = false;// you can you semaphore too class level variable
    public void methodA(){
          synchronized(LOCK){
               if(condition){ return;}// returning if already executed
               ..some code
               // Set condition to true so then again it should not run
               condition = true;
          }
    }
    
  • 您的代码将无法工作,因为您正在
    synchronized
    块中使用
    (对象级锁),并且两个线程都使用单独的对象,因此两个线程都将在不等待的情况下运行。 您可以使用类级锁,并在
    synchronized
    块中使用该锁,如下所示:

    private static final Object LOCK = new Object(); 
    
    public void methodA(){
        synchronized(LOCK){
         ..some code
       }
    }
    
    或者在两个线程中使用相同的对象

  • 您不能终止线程,您可以做的是在
    synchronized
    块中有一个信号量(或任何变量)和一个条件。检查是否设置了信号量,然后返回,否则在退出方法之前执行代码并设置信号量

    private static boolean condition = false;// you can you semaphore too class level variable
    public void methodA(){
          synchronized(LOCK){
               if(condition){ return;}// returning if already executed
               ..some code
               // Set condition to true so then again it should not run
               condition = true;
          }
    }
    


  • 您不能杀死队列中的线程,但可以使用毒药丸阻止队列

    您不能杀死队列中的线程,但可以使用毒药丸阻止队列

    您可以使用singleThreadExecutorPool执行任务,它将允许按顺序执行线程。

    您可以使用singleThreadExecutorPool执行任务,它将允许按顺序执行线程。

    维护一个信号量并锁定它。当第一个线程运行时,每个runnable读取信号量并查看其是否已锁定。你试过了吗?据我所知,SemaPahore也用于维护同步,对吗?使用synchronized块也会发生同样的情况,对吗?synchronized只允许一个执行线程同时访问资源。信号量允许多达n个(您可以选择n个)执行线程同时访问资源。在您的例子中,我假设您使用synchronized将代码执行限制为一次只能执行一个线程。事实上,由于满足您的条件,您可以简单地将执行锁定到线程并检查其他条件,以便其他线程可以执行相同的逻辑维护一个信号量并将其锁定。当第一个线程运行时,每个runnable读取信号量并查看其是否已锁定。你试过了吗?据我所知,SemaPahore也用于维护同步,对吗?使用synchronized块也会发生同样的情况,对吗?synchronized只允许一个执行线程同时访问资源。信号量允许多达n个(您可以选择n个)执行线程同时访问资源。在您的例子中,我假设您使用synchronized将代码执行限制为一次只能执行一个线程。事实上,由于满足您的条件,您可以简单地将执行锁定到线程并检查其他条件,以便其他线程可以执行相同的逻辑。通过这样做,两个线程的条件值将相同。我的意思是,该方法应该由第一个线程执行,而不应该对队列中的线程执行。@Srikanth检查第一点,您需要在类级别上有静态锁对象,或者在两个线程中使用主类的相同对象。让我理解一下。您建议使用一个由两个线程共享的锁变量,在任何时候,如果两个线程访问同一个方法,第一个线程会将锁设置为true,这反过来会阻止任何其他线程执行该方法。我的理解是正确的,还是出错了?锁只是为了防止两者同时运行,它是静态的,因为在不同的线程中使用不同的对象。在上面的示例中,我建议将一个静态变量设置为true,因此您建议我在LOCK对象上设置一个synchronized(),后跟一个信号量?通过这样做,两个线程的条件值将相同。我的意思是,该方法应该由第一个线程执行,而不应该对队列中的线程执行。@Srikanth检查第一点,您需要在类级别上有静态锁对象,或者在两个线程中使用主类的相同对象。让我理解一下。您建议使用一个由两个线程共享的锁变量,在任何时候,如果两个线程访问同一个方法,第一个线程会将锁设置为true,这反过来会阻止任何其他线程执行该方法。我的理解是正确的,还是出错了?锁只是为了防止两者同时运行,它是静态的,因为在不同的线程中使用不同的对象。在上面的示例中,我建议将静态变量设置为True,所以您建议我在锁ob上使用synchronized()