这是我的Timer
日程安排程序
timer.schedule(new SuperOne(),new Date(),10);
在SuperOne
方法的run
类中我调用synchronized
方法通过使用上面的代码该任务只运行一次。
我的要求是它必须每分钟(60秒)调用synchronized
方法。
这里的计时器调度程序没有按照我的预期运行...是因为我正在运行synchronized
方法吗?
请帮助我在这
* 编辑:它第一次工作(调用一次)而不是在10毫秒后调用*
这是必须运行的代码
private boolean proxyEnabled=false;
public synchronized void statusChecker()
{
StopWatch sWatch = new StopWatch();
ResourceBundle resource = ResourceBundle.getBundle("resources.application");
System.out.println(resource.getString("url"));
try {
URL url = new URL("https://www.google.com/");
HttpURLConnection urlConnection;
if(proxyEnabled) {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxYhost", portNumber));
sWatch.start();
urlConnection =(HttpURLConnection) url.openConnection(proxy);
System.out.println(urlConnection);
} else {
urlConnection =(HttpURLConnection)url.openConnection();
sWatch.start();
}
System.out.println(urlConnection.getResponseCode());
in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
if(in!=null)
{
System.out.println("The resopose TIme is -- >"+ sWatch.toString());
}else
{
System.exit(0);
}
}catch(Exception e)
{
e.printStackTrace();
System.exit(0);
}finally
{
sWatch.stop();
}
}
扩展TimerTask
public class SuperOne extends TimerTask{
boolean flag = false;
@Override
public synchronized void run() {
// TODO Auto-generated method stub
try {
System.out.println("*** * ** Thread started ** ** *** ");
Thread th = Thread.currentThread();
System.out.println(th.isAlive());
CheckServer cs = new CheckServer();
cs.statusChecker();
}
catch(Exception e)
{
System.out.println("Exception in Run IterFace "+e);
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
你已经run
synchronized
,这意味着每次只能有一个线程访问该功能(这实际上一次只能激活一个任务)。我不相信这是你打算做的。我想你打算做的是在执行run
期间调用synchronized
调用,这样只有一个正在运行的任务可以一次调用它来确保一致性。
很多人都对synchronized
所做的事情感到懊恼,因为它并没有像很多人所期望的那样(尽管如果你考虑常见的用例,它的名字就是这样做的)为了它)。有关更多信息,请参阅Java synchronized tutorial。