【问题标题】:Multithreading concept多线程概念
【发布时间】:2013-09-07 18:52:27
【问题描述】:

我现在正在学习多线程概念。我可以在处理程序和 Runnable() 的帮助下运行单个线程。我希望我的代码运行两个线程,比如 Thread1 运行 method1(),thread2 运行 method2()。 Thread1 应该运行 2 秒,然后休眠 1 秒。同时,thread2 应该唤醒并运行 1 秒。同样,thread1 应该运行 2 秒。这个过程应该连续进行。我正在 Android 中执行此操作。

这个问题可能看起来很简单,但我没有其他办法,除了在这里发布一个问题,因为我已经浏览了这个网站上的许多教程和问题。没有帖子适合我的上下文。任何建议将不胜感激。提前致谢。

【问题讨论】:

  • 使用 timer 和 timertask 来实现这个
  • 我该怎么做?请提供任何示例代码..
  • 没有两个交替睡眠的线程似乎破坏了拥有两个线程的意义吗?如果您举例说明每个线程应该做什么,也许您会得到与线程更相关的答案。

标签: java android multithreading


【解决方案1】:

您可以使用ScheduledThreadPoolExecutor 来做到这一点,通过它您可以实现任务的并行执行。一个安排任务的小示例:

//creates a thread pool of size 2
int poolSize = 2;
// creates ScheduledThreadPoolExecutor object with number of thread 2
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(poolSize);

//starts executing after 1 second
ScheduledFuture<Callable-Type> sf = stpe.schedule(new TaskOne(), 1,TimeUnit.SECONDS);

//starts executing after 2 seconds
ScheduledFuture<Callable-Type> sf1 = stpe.schedule(new TaskTwo(), 2,TimeUnit.SECONDS);

您可以如下定义您的任务:

class TaskOne implements Callable<Callable-Type> {
    @Override
    public Callable-Type call() throws Exception {
        //DO YOUR WORK HERE
        return callable-type;
    }
}

class TaskTwo implements Callable<Callable-Type> {
        @Override
        public Callable-Type call() throws Exception {
            //DO YOUR WORK HERE
            return callable-type;
        }
    }

使用ScheduledThreadPoolExecutor 优于Timer 的优点是:

  • Timer 只创建一个线程来执行定时器任务。预定的 线程池允许您提供多个线程来执行延迟和周期性任务,从而解决了这一限制。
  • Timer 的另一个问题是,如果 TimerTask 抛出未经检查的异常,它的行为就会很差。 Timer 线程不会捕获异常,因此 TimerTask 抛出的未经检查的异常会终止计时器线程。

参考:Java 并发实践

【讨论】:

  • 感谢@Debojit Saikia,感谢您的回复,并对我迟到的回复感到抱歉。我有疑问,我要运行的两个线程都是实现图像幻灯片的 UI 线程。我想为此使用 sleep(),notify() 方法。你能解释一下,你的代码是如何与这个问题相关的吗?
  • @nki 两个线程(T1,T2)都将在同一个对象(O1)上工作,因此它们中的任何一个(假设 T1)都可以等待特定条件变为真。当另一个线程(T2)在改变对象状态后调用notifyAll时,等待线程(T1)应该唤醒并开始工作——这是你的要求吗?抱歉,我对这个问题感到困惑。
  • 当 t1 运行 2 秒然后休眠 1 秒。 t2 在同一时间运行意味着,t2 运行 1 秒并休眠 2 秒。这是一些与并发概念有关的东西。
  • 线程 T1 和 T2 似乎没有同时运行。他们一个接一个地跑。我认为这可以通过单个执行线程来解决,使线程在 W1 工作 2 秒,然后在 W2 工作 1 秒。您可以将其放入while 循环中以重复此执行循环。谢谢。
【解决方案2】:

示例

Timer timer = new Timer();
                    timer.schedule(new TimerTask() {

                        @Override
                        public void run() {
                            runOnUiThread(new Runnable() {

                                @Override
                                public void run() {
                                    //your code
                                }
                            });
                        }
                    }, 2000, 1000); // 2000 is delay and 1000 is call period

还有另一种 schedule() 方法可用于映射您的条件。

【讨论】:

    【解决方案3】:

    你已经使用了以下两种机械化。

    Wait and Notify methods  
    

    【讨论】:

      猜你喜欢
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      相关资源
      最近更新 更多