您好,我遇到了恢复线程的问题,我的代码是
public boolean Wait(String Reply){
if (Reply.equalsIgnoreCase("Y")){
try {
t.resume();
}
catch (Exception e){
System.out.println("\n" + "The exception in resume thread method:::: " + e);
}
System.out.println("\n" + "In the Wait Function of Sender");
return true;
}
JOptionPane.showMessageDialog(j ,
"Please Wait While The User Accpets the Trasmission ",
"",
JOptionPane.INFORMATION_MESSAGE);
try{
t = new Thread(this);
t.sleep(100000);
}
catch (InterruptedException ie){
System.out.println(ie.getMessage());
}
return false;
}
我可能会解释它是如何工作的,因为它可以帮助你确定问题。
首先线程进入休眠状态......然后我从另一个名为public boolean Wait()
的函数调用此ReplyYes
函数,该函数传递值“Y”,然后我尝试恢复线程,但{ {1}}函数调用,而不是恢复线程给我一个t.resume()
并且线程没有恢复,导致返回一个FALSE值。再加上因为这个线程我甚至无法停止我的服务我必须等待线程到timeOut。
任何人都可以解释如何让它正常工作! 谢谢
答案 0 :(得分:3)
我认为你误解了Thread.sleep
的工作原理。这是静态方法。
行t.sleep(100000);
将当前线程置于休眠状态,而不是线程t
。
使当前正在执行的线程暂停(暂时停止执行)指定的毫秒数
强调我的。
你应该启动线程并从该线程调用sleep。有关启动线程的两种不同方法,请参阅以下文章:
此外,resume
仅适用于suspend
,并且已弃用。来自文档:
已弃用。此方法仅适用于
suspend()
,因为它容易出现死锁,因此已被弃用。有关详细信息,请参阅Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated?
获得NullPointerException
的原因可能是因为您尝试在调用t.resume()
之后创建新的Thread对象。那么在那时,t仍然具有值null
。基本上,您的代码需要从头开始重写。我建议按照我上面链接的教程,然后一旦你了解如何创建线程移动到下一章:
答案 1 :(得分:0)
首先你必须开始新的线程:t.start();
然后尝试唤醒你的线程:t.interrupt();
在Thread.sleep()
方法中调用run()
,这会导致调用此方法的睡眠线程