【问题标题】:How can I schedule a particular thread in Blackberry如何在黑莓中安排特定线程
【发布时间】:2009-10-29 12:21:06
【问题描述】:

我想以特定时间间隔自动安排线程。我还需要在后台连续执行此操作而不会挂起设备。

我已经用 Application Manager Class 尝试过这个,但它是用于应用程序调度的,我需要在应用程序中调度线程。

【问题讨论】:

    标签: java multithreading blackberry java-me


    【解决方案1】:

    我会使用TimerTask

    public class MyScreen extends MainScreen {
        private Timer mTimer;
        public MyScreen() {        
            mTimer = new Timer();
            //start after 1 second, repeat every 5 second
            mTimer.schedule(mTimerTask, 0, 5000);
        }
    
        TimerTask mTimerTask = new TimerTask() {
            public void run() {
                // some processing here
            }
        };
    }
    

    BlackBerry API Hidden Gems (Part Two)

    【讨论】:

      【解决方案2】:

      使用UiApplication.getUiApplication().invokeLater() 它接受延迟和重复参数,并将完全执行您需要的操作。

      编辑

      我知道这篇文章很旧,但这是迄今为止安排重复活动的最佳选择,我想补充一点,以停止安排的活动,需要以下内容:

      //Start repeating "runnable" thread every 10 seconds and save the event ID
      int eventId = UiApplication.getUiApplication().invokeLater(runnable, 10000, true);
      
      //Cancel the repetition by the saved ID
      UiApplication.getUiApplication().cancelInvokeLater(eventId);
      

      【讨论】:

      • 对,但是在给定的延迟(例如延迟 1 天)退出应用程序后,线程是否开始执行。
      • 你可以添加 UiApplication.getUiApplication().requestBackground();在您覆盖的 onClose() 方法中让应用程序在后台运行,但是(afaik)您从应用程序上下文的角度启动的任何线程都将在正确关闭后被杀死,包括计划线程。
      【解决方案3】:

      假设您希望它在设备启动时运行一个线程: 创建第二个项目并将其列为备用入口点。 在您的 UiApplication 或 Application main() 中,检查传递给项目的参数。通过 Thread.sleep 在那里做你的定期工作,不要调用 enterEventDispatcher。

      搜索“自动启动”: http://docs.blackberry.com/en/developers/deliverables/1076/development.pdf

      或者,如果您想在用户“启动”它后做某事,那么请考虑创建一个新线程来完成您的计时工作。覆盖屏幕的 onClose() 并使用 Application.getActivation().deactivate() 将屏幕置于后台。

      或者还有其他方法可以做类似的事情,比如invokeLater等。也许事件监听器可以做你需要的,但你没有提供很多细节。

      【讨论】:

        【解决方案4】:

        只要应用程序正在运行 - 只需创建线程并在每次工作后调用 Thread.sleep 直到您需要它保持休眠状态。

        如果您需要它在特定时间唤醒,而不是仅仅在特定时间休眠,那么您可以执行以下操作:

        Date wakeUpAt = ...; // Get this however
        Date now = new Date();
        long millisToSleepFor = wakeUpAt.getTime() - now.getTime();
        Thread.sleep(millisToSleepFor);
        

        【讨论】:

        • 谢谢,但在睡眠中它会挂起给定的时间(long millisToSleepFor)时间。
        • 你是说当线程休眠时,设备没有调度任何其他线程? sleep() 的全部意义在于线程没有在 CPU 上调度这么长时间......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多