这是我项目中的一段代码,我需要将此线程结束,直到结束,然后转到最后一个Log.i()并完成该功能。
public void delay3Seconds(final String txt1, final String txt2, final String s, final Intent i)
{
//keepMoving= false;
counter= 3;
secondsBool= true;
if(!errorMonitor)
{
Log.i("Main.delay3Seconds()", s+" in 3 seconds");
new Thread()
{
public void run()
{
while(secondsBool)
{
try {
Thread.sleep(1500);
}
catch (InterruptedException e){e.printStackTrace();}
if(!errorMonitor)
{
handler.post(new Runnable()
{
public void run()
{
final DialogFragment loadDF= new RecDialog(MainActivity.this, txt1, txt2, s+(counter--)+" שניות", null, false, true, ll.getWidth(), ll.getHeight());
loadDF.show(getSupportFragmentManager(), "RecDialog");
dialog.dismiss();
dialog= loadDF;
if(counter == 0)
secondsBool= false;
}
});
}
else
secondsBool= false;
}
if(!errorMonitor)
{
handler.post(new Runnable()
{
public void run()
{
dialog.dismiss();
if (i.resolveActivity(getPackageManager()) != null)
{
Log.i("Main.delay3Seconds()", "resolveActivity != null");
setResolveNotFail(true);
Log.i("Main.delay3Seconds()", "resolveNotFail = "+resolveNotFail);
startActivity(i);
}
else
{
Log.i("Main.delay3Seconds()", "resolveActivity == null");
setResolveNotFail(false);
Log.i("Main.delay3Seconds()", "resolveNotFail = "+resolveNotFail);
}
}
});
}
}
}.start();
}
Log.i("Main.delay3Seconds()", "(end) resolveNotFail = "+resolveNotFail);
}
我无法弄清楚如何做到这一点。我尝试使用synchronized(),但我可能使用它错误,因为该函数首先完成自己,然后只有线程工作,同时活动。
我很感激有关如何做到这一点的任何提示..
答案 0 :(得分:0)
这绝对不是你使用Thread的方式或原因。首先,如果这是UI线程,你应该永远不要暂停它3秒钟。其次,Thread的整个要点是并行工作。你永远不希望一个线程暂停并等待另一个线程。如果你需要线程A上的东西只在线程B完成时发生,你在线程B完成时通过处理程序,信号量或其他方法向线程A发送消息。
看看你的代码,看起来你应该抛弃它并用计时器重新实现它。
答案 1 :(得分:0)
https://docs.oracle.com/javase/tutorial/essential/concurrency/join.html
在启动线程后调用.join()方法,这样调用线程将等到新线程执行完毕。 像这样:
Thread t = new Thread(...);
t.start();
t.join();