2012-03-07 78 views
0

我想创建一个解决方案来处理由于内存泄漏,我们的应用程序中锁定的资源而导致的挂起线程。我遇到的主要问题之一是试图模拟一个挂起的线程来处理它。任何消化?如何使Java线程挂起

这是我试过的,但它似乎并没有完成这项工作。有什么想法吗?

class KillerThread extends Thread{ 

    public KillerThread() { 
     super(); 
    } 
    public KillerThread(String threadName) { 
     super(threadName); 
    } 
    public void run(){ 
     System.out.println("Start of KillerThread " + this.getName()); 
     if (System.currentTimeMillis() % 2L == 0){ 
      try { 
       sleep(Long.MAX_VALUE); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      for(;;); 
     } 
    } 
} 
+1

你检查http://stackoverflow.com/questions/3203139/how-do-you-hang-a-thread-in-java-in-one-line – naresh 2012-03-07 11:35:38

+0

为我工作。你怎么开始线程? – adarshr 2012-03-07 11:35:39

+1

“鸿”是什么意思?你的意思是,即使中断()也不会做任何事情吗? – 2012-03-07 11:42:48

回答

1

尝试像while循环运行的睡眠:

while(true) { 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
+0

我的IDE给我一个警告消息'Thread.sleep在循环中调用? – ThreaT 2015-06-11 16:13:44

+0

哇,老答案!是的,一般睡在一个循环导致表现不佳。您的IDE(NetBeans)会对此提出警告。为了这个问题,这可以被忽略。 – Terraego 2015-06-12 08:21:24

0

运行的线程,然后告诉它在一个不可阻挡的循环睡觉,是个不错的主意,。但如果你想让它等待另一个线程,。使一个以上的线程,并让他们彼此等待,一个僵局,是一个挂钩,。

0

足够简单,只需要创建一个私有成员

private Object lock = new Object(); 

然后用它来等待通知(即永远不会发生,除非你使用反射...)

while (true) { 
    try { 
     synchronized (lock) { 
     lock.wait(); 
     } 
    } cath (InterruptedException e) { 
     /* ignore interruption */ 
    } 
} 

和你线程将挂在那里,不间断。

+0

'UninterruptedException'?当线程不间断时抛出? ;-) – Jesper 2012-03-07 13:11:17

+0

大声笑,是的,:)我希望这些天我会有不间断的睡眠! – 2012-03-07 14:59:21

0

我知道你需要什么,你正在通过停止执行程序线程来测试某些东西。尝试是这样的:

private void testKillingThread() { 
    Object kill = new Object(); 
    try { 
     synchronized (kill) { 
      kill.wait(); 
     } 
    } catch (Exception e) { 
     // Auto-generated catch block 
    } 
} 
+0

你需要使用'while(true){kill.wait(); }'以防止虚假的唤醒。请参阅:http://stackoverflow.com/a/3203164/257299 – kevinarpe 2015-10-16 02:08:49

+0

@kevinarpe但这是如何可能的,当它与同步安全 – GingerHead 2015-10-16 09:22:19

+0

好问题。虚假唤醒非常复杂(!)。设想一下传统的POSIX信号,例如'SIGUSR1',(通过'kill'命令行工具)发送到您的进程。通过POSIX规则(AFAIK),内核将唤醒每个睡眠/等待线程并通知输入信号。这是为什么如果等待条件满足,程序员需要检查谓词(布尔情况)的经典案例。关于JVM +信号的参考:http://www.oracle.com/technetwork/java/javase/signals-139944.html – kevinarpe 2015-10-16 10:16:43

0

这里有一个快速解决我使用的测试。只需要锁定电话号码new Hanger().hang()即可。

删除日志记录,如果你不想看到它。你可以添加throws InterruptedException(但事实上,它永远不会)挂起方法,所以你可以用new Hanger().hang()代替Thread.sleep()而不用修改你的代码。

public class Hanger { 

    private final static Logger log = Logger.getLogger(Hanger.class); 
    private long started = 0; 
    private final int beat = 100; // ms 

    /** 
    * Hangs a thread for the indicated time 
    * @param millis the amount of time to hang the thread, in milliseconds 
    */ 
    public void hang(int millis) { 
     started = System.currentTimeMillis(); 
     log.debug("Hanging this thread for " + millis + " ms"); 
     while (hung() < millis) { 
      try { 
       Thread.sleep(beat); 
      } catch (InterruptedException e) { 
       log.debug("Still hanging, will release in " + (millis - hung()) + " ms."); 
      } 
     } 

     log.debug("Releasing thread again after " + hung() + " ms"); 
    } 

    private int hung() { 
     return (int)(System.currentTimeMillis() - started); 
    } 
}