我想创建一个java类(线程)来ping twitter,如果没有连接,请等待连接,然后重新运行一些其他类和线程。我有"ping"网站的代码,运行每个静态方法的方法都在我的Main类中。这是解决这个问题的好办法吗?
以下是代码的基本部分:
while (true){
try {
final URLConnection connection = new URL(url).openConnection();
connection.connect();
}
catch (Exception e) {
Thread.sleep(10000*t);
if (url.matches(twitter1)){
Thread method1= new Thread(Class1.method1);
method1.start();
}else if (url.matches(twitter2)){
Thread method2 = new Thread(Class1.method2);
method2.start();
}else if (url.matches(twitter3)){
Main.StaticMethod();
}else if (url.matches(twitter4)){
Main.StaticMethod2();
}else if (url.matches(twitter5)){
Main.StaticMethod3();
}else{
System.out.println("Unknown URL");
}
t=2^t;
}
}
如果不运行类或线程,则只能调用方法。如果方法是instance methods
,那么您需要一些object
;否则它们是static
,并且您需要知道它们在其中定义的class
。如果要启动另一个thread
,则需要class
的object
,即implements Runnable
。
例如,
try {
final URLConnection connection = new URL(url).openConnection();
connection.connect();
} catch (Exception e) {
}
// connection is available, either use it or close it. then,
// AfterConnect is a class that implements Runnable. Perhaps it takes
// the connection as parameter?
AfterConnect afterConnect = new AfterConnect(..);
// this will start a new thread
new Thread(afterConnect).start();
顺便说一句,你的例子并不是"等到有了连接"。如果要将try...catch
放入循环中,则应该在两次迭代之间sleep
一段时间。
如何定义"运行"类?一种方法是将对这些类的引用存储在timeOut类中,然后在成功ping站点时调用所需的方法。
我不太确定你是如何构建"重新运行一些其他类和线程"的东西的。如果它是一个方法调用的大杂烩,那么你可以把你提供的代码放在一个抽象类中,并添加一个抽象方法
abstract class AbstractTimeout {
... your code here, but add a call to afterConnection() ...
protected abstract void afterConnection();
}
子类将通过为构造函数中的所有类对象和调用设置一些字段来实现这一点,然后在中实现调用的混合
protected void afterConnection() {
class1.goDoThis();
object2.goDoThat();
someRunnable.run();
// ... etc...
}
这是经典的inheritance
。顺便说一句,您需要考虑可能抛出哪些异常以及声明哪些异常。为了简单起见,我忽略了这个问题。
或者,如果"重新运行一些其他类和线程"的内容已经在相当简单和组织良好的东西中,比如Runnable
,那么您可以让您的类将Runnable
和URLConnection
作为参数,并在连接完成后运行()Runnable(或在新线程中启动它)。这是经典的构图。例如
public void doTimeout(URL url, Runnable afterConnection) {
// your connection stuff from above
afterConnection.run();
}
注意:我没有将afterConnection.run()放入线程中,因为我认为doTimeout应该已经在它自己的线程中了。YMMV。
注2:我的第二个解决方案类似于Connect()概念后的@Miserable Variable。我用的是Runnable,他用的是更灵活的界面。