2011-12-29 55 views
-1

“我有一个XYZ类,我已经写了两个方法A和B,现在两个线程在这个类的一个对象上运行,一个线程在A方法中,我希望只要第二个线程调用我的B方法,方法A中的线程应立即停止并出来,有人告诉我这个解决方案吗?“立即停止线程作为第二个线程需要访问

+2

所以你希望你的数据结构一旦出现竞态条件就会被破坏?哦,这很容易:删除所有的锁。更严重的是:你确实解决了错误的问题:更多的上下文。 – Voo 2011-12-29 17:24:10

+0

我认为你没有得到我的观点我想在第二次尝试输入时立即停止第一个线程 – 2011-12-29 17:26:22

+0

共享方法没有问题,因为它们没有改变(或者你没有看到它们改变;)问题只是共享可变数据。我不担心哪些线程在运行哪些方法,而是担心共享数据何时被更改。 – 2011-12-29 17:26:33

回答

2

让我直接回答你的问题,并告诉你为什么它是一个坏主意。

private Thread lastThread; 

public void transferMoney(Account account, Account account2, int amount) { 
    Thread t = lastThread; 
    if (t != null) 
     t.stop(); // so another thread running this immediately on a random line. 
    lastThread = Thread.currentThread(); 
    // lastThread could die here 
    if (account1.withdrawn(amount)) { // the withdraw was successful 
     // lastThread could die here 
     account2.deposit(amount); 
    } 
    // lastThread could die here 
    lastThread = null; 
} 

该代码存在许多方面的缺陷,但是如果两个线程输入此方法,则第一个线程可能会停止。但是,它可能会使帐户1缺少未转移到帐户2的资金。 (或更糟糕的)

简而言之,让一个线程杀死另一个线程是没有意义的,事实上,您要尽量避免这种情况,所以以任何方式鼓励它都不是好主意。

+1

pstt,你做了lastThread final。很确定你不是这个意思。 – Dunes 2011-12-29 17:45:02

+0

@彼得这是你的实现..有可能我们需要这种情况。谢谢你的回复buddy – 2011-12-29 17:50:38

+0

@peter我可以有你的电子邮件ID吗? – 2011-12-29 17:58:51