java线程和同步方法没有按要求执行

rdrgkggo  于 2021-06-27  发布在  Java
关注(0)|答案(3)|浏览(273)

我连续两天都在尝试,并且已经就相关问题提出了很多问题和答案。
背景:
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不能在线程类上下文的完全锁定对象上等待几秒钟才能完成已经运行和同步的方法,这让我很担心。我希望我在这里能有所了解。谢谢大家。

guicsvcw

guicsvcw1#

如果你发射 Singular_Processor 从你需要做的同样的服务 needWait 在所有人之间共享 Singular_Processor 线程。一种可能的解决方案是将其放在服务本身中,因为您在同一上下文上同步并使用 needWait 这是一个领域的不同示例 Singular_Processor 班级。

o7jaxewo

o7jaxewo2#

把自己的问题的答案贴在网上,供将来的访问者参考
线程类:

class Singular_Processor extends Thread
{
    private static final String TAG = "Singular_Processor";
    final Context context;

    Singular_Processor(Context context)
    {
        this.context = context;
    }

    @Override
    public void run()
    {
        try
        {
            Log.d(TAG, "run: starting " + Thread.currentThread().getId() + ".. \n");
            doNotDisturbMe();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    private static synchronized void doNotDisturbMe()
    {
        try
        {
            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");
        }
    }
}

呼叫场景:
无论您是从项目的任何地方以任何时间间隔以任何频率启动单个线程还是多个线程。。就像我的例子中的广播接收器-

final Singular_Processor singularProcessor = new Singular_Processor(this);
singularProcessor.start();

无论调用了多少次以上的行,以及创建了多少个该线程的示例。。
作为一个 static method 从不为类的特定示例或线程示例创建。
就像我创造的那样 static synchronised 所有的线程示例都会运行自己示例的方法,并且会感到震惊,哦,我调用的方法也是静态的和同步的。
个人 threads are so smart and intelligent 足够我甚至不需要 wait 任何人也不必担心 notify 任何人 notify all 预期产量:

2020-12-30 22:31:07.856 7866-8309/MyPackage D/Singular_Processor: run: starting 7014.. 
2020-12-30 22:31:07.856 7866-8309/MyPackage D/Singular_Processor: RUNNING THE THREAD ID : 7014.. 
2020-12-30 22:31:11.285 7866-8389/MyPackage D/Singular_Processor: run: starting 7016.. 
2020-12-30 22:31:17.857 7866-8309/MyPackage D/Singular_Processor: COMPLETED THE THREAD ID : 7014.. 
2020-12-30 22:31:17.858 7866-8389/MyPackage D/Singular_Processor: RUNNING THE THREAD ID : 7016.. 
2020-12-30 22:31:27.859 7866-8389/MyPackage D/Singular_Processor: COMPLETED THE THREAD ID : 7016..
2hh7jdfx

2hh7jdfx3#

thread.sleep()不会释放同步锁。查看其javadoc:

The thread does not lose ownership of any monitors.

因此,只有一个线程可以进入同步块。

相关问题