2016-07-28 40 views
0

我正在使用一个线程来运行应用程序的一半,另一半正在运行。我这样做是为了让一部分获取数据(因为我正在运行一个无限循环)不会阻止另一部分完成它的工作。现在我想知道:如果一个部分发生异常,它会阻塞另一部分,因为它们彼此依赖。如何防止异常停止我的程序?

所以我的问题是,我怎么能阻止异常停止我的整个程序,并使其继续做事?

+0

这只是不正确的方式来使用多线程。您必须创建某种同步方法,以便如果有差异,则必须等待另一个(此“一”和“另一个”取决于您的代码的设计方式)。 有没有干净的方式来处理这种异常。在这种情况下,Try/Catch不会很好地工作。 –

回答

0

试抓或抛出异常。如果这些听起来都不熟悉,我会查找它们。

的try-catch的一个例子抛出异常

try 
{ 
//your code that may throw exception 
}catch(TheException e){ 
e.printStackTrace(); // or however you handle exceptions 
} 

很好的资源:https://docs.oracle.com/javase/tutorial/essential/exceptions/throwing.html

+0

这并不足以直接解决原始问题。如果由于未捕获的异常导致另一个线程崩溃,原始问题将询问一个线程的稳定性。 – nasukkin

0

从一个线程抛出异常通常不会影响他人的运行时间。在这方面,线程对于他们自己的小世界来说很有意思。如果两个线程共享一些状态(不管是直接通过堆还是间接通过数据库或类似的东西),并且一个线程将应用程序的数据置于不稳定/损坏的状态,因为它被轰出,明显影响其他线程的行为,使他们进一步“坏东西”。你会尽可能地防止这种情况;最好的办法是尽可能记录异常,并在抛出时捕捉并处理它们,并用强大的单元测试来支持您的逻辑。

0

您可以创建一个布尔变量,可能被称为running,这样虽然您的while循环工作正常,但此变量将为true。立即发现异常,变量变为false。然后,您的主要任务可以随时检查变量是否希望使用共享数据。如果变量为真,则读取数据;否则,请根据捕获到的异常类型来执行其他操作,例如重新启动线程。

请记住,为了使变量为false,您需要将其更新包含在catch子句中。

有更好和更复杂的方法,如使用ExecutorService

相关问题