【问题标题】:How can I make sure a thread is completed its task,then only new Thread can start in java?如何确保线程完成其任务,然后只有新线程才能在 java 中启动?
【发布时间】:2014-09-16 12:48:52
【问题描述】:

我很惊讶如何知道一个线程成功完成了它的任务,然后只允许另一个线程执行? 说明:假设我有 10 个模块。但是线程应该按顺序执行任务。在完全完成对一个模块的请求后,它才应该跳转到下一个模块。

下面是我的代码:

SiaThread.java

Collection <Modulo> modules = mppt.getModuloCollection();
for(Module module:modules){
   UriThread threadUri = new UriThread(UriThread.URI_ENERGY_DAY,uriPath,"GET",semapore, module, gduSemapore,devType);
      UriThread threadUriFault = new UriThread (UriThread.URI_FAILURE, uriPath, "GET", semapore, module, gduSemapore,devType);
      }



UriThread.java
public UriThread (int iType, String strBaseUrl, String strmethod, Semaphore objsemaphore, Modulo module, GduSemaphore gduSemapore,String devType) {
        this.iUriType = iType;
        this.iRetry = 0;
        this.strBaseUrl = strBaseUrl; 
        this.strMethod = strmethod;
        this.semaphore = objsemaphore;
        this.gduSemapore = gduSemapore;
        this.modulo = module;
        this.strResponse = "";
        this.devType=devType;
        setState (URI_FORMATION);
        threadUrl = new Thread(this);
        threadUrl.start();
    }

任务需要一个接一个地完成,如果线程还没有完成它的任务,那么它应该等待。

.Here semapore=new Semapore(10,true);

对问题的更多解释:一个 SiaThread 里面有上面两个线程正在运行。我希望 SiaThread 将等待在一个模块的循环中完成其任务,然后在循环中为另一个模块执行任务。请用代码给我建议,以便我更好地理解它。

【问题讨论】:

  • 如果你想让两个动作顺序执行,你应该在同一个线程中执行它们。
  • 阅读此docs.oracle.com/javase/tutorial/essential/concurrency/join.html。我希望这会对你有所帮助。
  • 你好Peter Lawrey,对于一个模块,任务可以同时发生,但是在一个模块的两个线程完成后,它们应该转到下一个模块。
  • @Rasmitapatra 那么这是一个不同的问题。
  • 如果您希望两个或更多线程按顺序运行,请使用 thread.join()。但我希望您想要的不是所有线程都按顺序运行,而是一个特定线程的完成取决于另一个线程。

标签: java multithreading


【解决方案1】:

您应该加入您正在等待的线程。您可以在官方 Java 文档中阅读更多内容:http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html

从那里:“join 方法允许一个线程等待另一个线程完成。如果 t 是其线程当前正在执行的 Thread 对象。”

【讨论】:

    【解决方案2】:

    对于给定的要求,使用 Thread.join()。对于更高级的线程控制需求,使用 synchronized,wait,notify 来实现一个监听;还应评估更高级别的 api(java 并发包)。

    【讨论】:

      【解决方案3】:

      如果您想自己处理任务的顺序,请使用Thread.join()。或者看看java.util.concurrent.Executors.newSingleThreadExecutor(),它可以为你按顺序处理任务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多