Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中等待一个线程启动另一个线程?_Java_Android_Multithreading_Wait_Synchronize - Fatal编程技术网

Java 如何在Android中等待一个线程启动另一个线程?

Java 如何在Android中等待一个线程启动另一个线程?,java,android,multithreading,wait,synchronize,Java,Android,Multithreading,Wait,Synchronize,每次单击按钮时都会调用此代码 //Thread called when click a button Thread a = new Thread(new Runnable() { @Override public void run() { synchronized ((Object) contadordeMierda){ Random rn = new Random();

每次单击按钮时都会调用此代码

   //Thread called when click a button
    Thread a = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized ((Object) contadordeMierda){
                Random rn = new Random();
                int n= rn.nextInt(10) + 1;
                contador++;

                try {
                    Thread.sleep(n*100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println(contador);
            }
   }
    });

    a.start();
当我快速触摸它几次时,我得到以下输出:

I/System.out﹕ 一,

I/System.out﹕ 二,

I/System.out﹕ 五,

I/System.out﹕ 五,

I/System.out﹕ 九,

I/System.out﹕ 九,

I/System.out﹕ 九,

I/System.out﹕ 九,

I/System.out﹕ 九,


我如何才能等待一个线程完成,然后启动另一个线程?所以印刷品是1 2 3 4 5 6 7 8 9 10 11 12…?

这正是本书的目的。有人多次提出这样的问题:。

为什么不这样做:只有当当前没有线程运行时,才允许启动新线程:

private boolean isThreadRunning = false;//declare a boolean field to store thread status whether it's running or not
...

if(!isThreadRunning){
    Thread a = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized ((Object) contadordeMierda){
                Random rn = new Random();
                int n= rn.nextInt(10) + 1;
                contador++;

                try {
                    Thread.sleep(n*100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println(contador);
                isThreadRunning = false;//Set the boolean variable to false because the thread has completed it's operations.
            }
   }
    });

    a.start();
    isThreadRunning = true;// Set the boolean to true because thread.start has been called.

}

我不完全确定android,但我很难相信按钮点击是异步处理的,所以我怀疑线程没有以正确的顺序启动,而是它们的执行顺序没有得到保证。最好使用带有单个支持线程或类似线程的ExecutorService。在何处以及如何声明锁
contadordeMierda
?内部运行(){synchronized((对象)contadordeMierda){…如果我不强制转换为对象,它会显示一个错误。您是否在按钮的OnClickListerner中声明了
contadodemierda
?我不能这样做,因为我希望线程在第一个线程之后启动,以便如何使用它?我如何保证int将具有正确的值?在两个链接中都解释了如何使用它。您无法保证如果在线程内部初始化
int
,请查看您的顺序。将int置于线程范围之外或在开始时将其传递给线程。