You could use Semaphore or CountDownLatch in java.util.concurrent.

Or, if your threads pass data objects to one another, a blocking queue.

Or, probably, use HandlerThread(s) that would communicate using Handler
messages...
 10.02.2012 2:21 пользователь "John Goche" <[email protected]>
написал:

> Hi all,
>
> The problem I am having is that the thread I need to call join() on so as
> to wait for completion may not even yet be started when I call join(). Is
> it
> legal in Java to call join() on a thread which is not running, but which
> will
> eventually be run by a third thread?
>
> Thanks,
>
> JG
>
> 2012/2/9 John Goche <[email protected]>:
> > Basically sendRequest() invokes a thread which calls runOnUiThread with
> > a new Runnable() which in turn also invokes a new Thread(). It is this
> latter
> > thread which I need to wait for to finish. I thought of using the join()
> method
> > to force thread completion prior to continuation at a specific spot but
> I am
> > somewhat new to thread programming and I am not entirely sure
> > about how to set things up. Will give it another go...
> >
> > Thanks for your help,
> >
> > JG
> >
> > 2012/2/9 John Goche <[email protected]>:
> >> Thanks Kostya!
> >>
> >> I have traced the code with the debugger and found that even though
> >> notify() is being called from within a thread instantiated from
> sendRequest()
> >> (which is not the same thread as sendRequest()'s thread), the notify()
> is
> >> being called before the wait().
> >>
> >> I am assuming that if I call notify() before wait() the notification
> gets lost?
> >> If this is not so, someone please let me know.
> >>
> >> The problem I am having is that sendRequest() launches a new thead s,
> >> and I need to be sure thread s completes before the code proceeds past
> >> what I have marked with wait().
> >>
> >> Any ideas on how to solve this synchronization problem?
> >>
> >> Thanks,
> >>
> >> John Goche
> >>
> >>
> >> 2012/2/9 Kostya Vasilyev <[email protected]>:
> >>> Are you calling notify() from inside sendRequest()?
> >>>
> >>>
> >>> If so, it's the same thread, and notify has nothing to do.
> >>>
> >>> http://developer.android.com/reference/java/lang/Object.html#notify()
> >>>
> >>> Causes a thread which is waiting on this object's monitor (by means of
> >>> calling one of the wait() methods) to be woken up
> >>>
> >>>
> >>> From looking at the code you posted, there is no thread waiting on the
> lock
> >>> because you only have one worker thread, and when it's calling notify
> it's,
> >>> well, calling notify and not waiting on a wait().
> >>>
> >>>
> >>> For debugging, set a breakpoint at lock.notify, and use the DDMS thread
> >>> monitor or the debugger window to examine your threads.
> >>>
> >>>
> >>> You might want to look at this package, which provides higher-level
> >>> concurrency classes, and try to find one that fits what you're trying
> to do:
> >>>
> >>>
> http://developer.android.com/reference/java/util/concurrent/package-summary.html
> >>>
> >>> ( ThreadPoolExecutor? BlockingQueue? )
> >>>
> >>> -- Kostya
> >>>
> >>> 10 февраля 2012 г. 0:41 пользователь John Goche <
> [email protected]>
> >>> написал:
> >>>>
> >>>> Dear Android developers,
> >>>>
> >>>> I am having the following issue in Android:
> >>>>
> >>>> In one class I am having:
> >>>>
> >>>> --------------------------------------------
> >>>>
> >>>>  final Object lock = new Object();
> >>>>
> >>>>  Thread thread;
> >>>>
> >>>>  @Override
> >>>>  public void onCreate(Bundle savedInstanceState) {
> >>>>
> >>>>    super.onCreate(savedInstanceState);
> >>>>
> >>>>    thread = new Thread() {
> >>>>
> >>>>      @Override
> >>>>      public void run() {
> >>>>
> >>>>        sendRequest("foo");
> >>>>
> >>>>        synchronized(lock) {
> >>>>
> >>>>        try { lock.wait(); } catch (InterruptedException e) {
> >>>> e.printStackTrace(); }
> >>>>
> >>>>        }
> >>>>
> >>>>        System.out.println("GOT HERE!!!");
> >>>>
> >>>> ------------------------
> >>>>
> >>>> which causes the sendRequest() to do a bunch of stuff. When such stuff
> >>>> finishes I call:
> >>>>
> >>>>      System.out.println("Notifying thread...");
> >>>>      synchronized(lock) {
> >>>>        lock.notify();
> >>>>      }
> >>>>      System.out.println("Thread notified.");
> >>>>
> >>>> -------------------------
> >>>>
> >>>> and this code executed until the "Thread notified." println()
> >>>> statement. But then I do
> >>>> not see the waiting thread resume from where I called wait(). Here is
> the
> >>>> output
> >>>> from adb logcat:
> >>>>
> >>>> I/System.out( 2395): Thread notified.
> >>>> W/ActivityManager(   60): Launch timeout has expired, giving up wake
> lock!
> >>>>
> >>>> I do not see where I am going wrong. Any ideas why the code is not
> >>>> working as expected?
> >>>>
> >>>> Thanks,
> >>>>
> >>>> John Goche
> >>>>
> >>>> --
> >>>> You received this message because you are subscribed to the Google
> >>>> Groups "Android Developers" group.
> >>>> To post to this group, send email to
> [email protected]
> >>>> To unsubscribe from this group, send email to
> >>>> [email protected]
> >>>> For more options, visit this group at
> >>>> http://groups.google.com/group/android-developers?hl=en
> >>>
> >>>
> >>> --
> >>> You received this message because you are subscribed to the Google
> >>> Groups "Android Developers" group.
> >>> To post to this group, send email to
> [email protected]
> >>> To unsubscribe from this group, send email to
> >>> [email protected]
> >>> For more options, visit this group at
> >>> http://groups.google.com/group/android-developers?hl=en
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to