我连续两天都在尝试,并且已经就相关问题提出了很多问题和答案。
背景:
runnable类从另一个服务类获取多个调用。
runnable类必须在重新启动之前完成已经运行和同步的方法
从服务调用可运行线程:
final Singular_Processor singularProcessor = new Singular_Processor(this);
singularProcessor.start();
synchronized(singularProcessor.context)
{
while(singularProcessor.needWait)
{
wait();
}
}
实际可运行线程类:
class Singular_Processor extends Thread
{
private static final String TAG = "Singular_Processor";
final Context context;
boolean needWait = false;
Singular_Processor(Context context)
{
this.context = context;
}
@Override
public void run()
{
try
{
doNotDisturbMe();
}
catch (Exception e)
{
e.printStackTrace();
}
}
private void doNotDisturbMe()
{
synchronized (context)
{
try
{
needWait = true;
Log.d(TAG, "RUNNING THE THREAD ID : " + Thread.currentThread().getId() + ".. \n");
Thread.sleep(10000);
Log.d(TAG, "COMPLETED THE THREAD ID : " + Thread.currentThread().getId() + ".. \n");
}
catch (Exception e)
{
e.printStackTrace();
Log.d(TAG, "EXCEPTION THE THREAD ID : " + Thread.currentThread().getId() + ".. \n");
}
finally
{
needWait = false;
context.notifyAll();
}
}
}
}
预期输出:
2020-12-30 17:55:46.519 30184-30398/ D/Singular_Processor: RUNNING THE THREAD ID : 6053..
2020-12-30 17:55:50.474 30184-30455/ D/Singular_Processor: COMPLETED THE THREAD ID : 6053..
2020-12-30 17:55:56.520 30184-30398/ D/Singular_Processor: RUNNING THE THREAD ID : 6056..
2020-12-30 17:56:00.475 30184-30455/ D/Singular_Processor: COMPLETED THE THREAD ID : 6056..
什么是电流输出:
2020-12-30 17:55:46.519 D/Singular_Processor: RUNNING THE THREAD ID : 6053..
2020-12-30 17:55:50.474 D/Singular_Processor: RUNNING THE THREAD ID : 6056..
2020-12-30 17:55:56.520 D/Singular_Processor: COMPLETED THE THREAD ID : 6053..
2020-12-30 17:56:00.475 D/Singular_Processor: COMPLETED THE THREAD ID : 6056..
是否有任何错误:
一点也不,因为一切都是语法正确的。为什么android不能在线程类上下文的完全锁定对象上等待几秒钟才能完成已经运行和同步的方法,这让我很担心。我希望我在这里能有所了解。谢谢大家。
3条答案
按热度按时间guicsvcw1#
如果你发射
Singular_Processor
从你需要做的同样的服务needWait
在所有人之间共享Singular_Processor
线程。一种可能的解决方案是将其放在服务本身中,因为您在同一上下文上同步并使用needWait
这是一个领域的不同示例Singular_Processor
班级。o7jaxewo2#
把自己的问题的答案贴在网上,供将来的访问者参考
线程类:
呼叫场景:
无论您是从项目的任何地方以任何时间间隔以任何频率启动单个线程还是多个线程。。就像我的例子中的广播接收器-
无论调用了多少次以上的行,以及创建了多少个该线程的示例。。
作为一个
static method
从不为类的特定示例或线程示例创建。就像我创造的那样
static synchronised
所有的线程示例都会运行自己示例的方法,并且会感到震惊,哦,我调用的方法也是静态的和同步的。个人
threads are so smart and intelligent
足够我甚至不需要wait
任何人也不必担心notify
任何人notify all
预期产量:2hh7jdfx3#
thread.sleep()不会释放同步锁。查看其javadoc:
因此,只有一个线程可以进入同步块。