0

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

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

4

3 回答 3

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() 方法可用于映射您的条件。

于 2013-09-04T10:12:17.020 回答
2

您可以使用 来执行此操作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;
        }
    }

使用ScheduledThreadPoolExecutorover的优点Timer是:

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

参考:Java 并发实践

于 2013-09-04T11:35:21.757 回答
0

您使用以下两种机械化。

Wait and Notify methods  
于 2013-09-04T10:13:32.270 回答