【问题标题】:How to change the order of thread execution ,that the last created thread run the first?如何更改线程执行的顺序,最后创建的线程首先运行?
【发布时间】:2015-03-13 04:26:35
【问题描述】:

我们动态添加线程。首先编号为 1,并开始运行,一旦创建 2_nd 线程,第一个线程应该阻塞并且 2_nd 线程应该执行,当 2_nd 线程完成时任务 1_st 线程继续执行。这个应该适用于动态 N 个线程。我需要顺序工作线程和单线程执行。 onItemClick 每次我创建线程并需要最后创建的线程执行其他等待。这是 onItemClick 中的代码 而在我的代码中,它按顺序运行。一个完成然后启动另一个

Thread testThread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(5000);
                for (int i = 0; i < 15; i++) {

             Log.i("log", "name = " + i +                      Thread.currentThread().getName());
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }, "ThreadName=" + magazineId);



    try {
        Thread currentThread = Thread.currentThread();
        if(Looper.getMainLooper().getThread() != currentThread) {
            // Current Thread is Main Thread.
           currentThread.join(100);
        }

    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    testThread.start();

【问题讨论】:

  • 我已经阅读了,但它对如何组织我描述的线程执行顺序没有帮助。
  • 先尝试一下,把你的代码放在这里,然后社区当然可以插入缺失的部分
  • 一旦你发现自己试图操纵线程的执行顺序,你就知道你肯定使用了错误的工具来完成你的工作。如果您需要顺序执行,请不要使用线程。线程的唯一目的是非顺序执行。

标签: java multithreading


【解决方案1】:

查看 Naman Gala 发布的链接,我认为您正在寻找的是 join()。

来自帖子:

join() 如果任何正在执行的线程 t1 在 t2 上调用 join() 即; t2.join() t1 将立即进入等待状态,直到 t2 完成 执行。

【讨论】:

    【解决方案2】:

    我不知道有任何 API 可以满足您的描述。如果我理解正确,您希望“最新”线程抢占其他(以前/旧)线程的执行,但这并不是 Java 的并行执行模型固有的工作方式。

    因此,要实现您想要的,您需要自己明确添加这种同步。

    这意味着:您需要一个所有线程都知道的单独数据结构(例如,一组按时间戳排序的线程-时间戳对)。在每个线程中,您需要定期检查(当前运行的)线程是否是排序集中的“最顶层”(即,它有权被执行)。如果没有,则需要等待。

    您可以使用一个计数为 1 的附加信号量(即互斥量),这样您就可以确保在任何给定时间点只有一个线程实际上在做某事。

    【讨论】:

    • 当最后一个线程完成任务时,其他线程可以继续。
    • 你能给我任何有用的链接吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多