如何在Java中杀死队列中等待执行方法的线程
我在main类中有一个公共方法,它将由主线程执行,在某些情况下还将由另一个线程执行。代码结构如下所示如何在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 } } }
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()