Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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 螺纹冻结筛_Java_Android_Multithreading - Fatal编程技术网

Java 螺纹冻结筛

Java 螺纹冻结筛,java,android,multithreading,Java,Android,Multithreading,所有这些都在同一个类和onCreate方法中: String arrayExtra[] = {"1"}; for(int x = 0; x < arrayExtra.length; x++){ Thread thread = new Thread(new Runnable(){ @Override public void run(){ try{ final EditText etAbun = (EditText) findViewBy

所有这些都在同一个类和onCreate方法中:

String arrayExtra[] = {"1"};
for(int x = 0; x < arrayExtra.length; x++){
Thread thread = new Thread(new Runnable(){
    @Override
    public void run(){
        try{
            final EditText etAbun = (EditText) findViewById(R.id.etIsoAbunNum);
            synchronized(this){
                wait();
                allExtraiso.add(etAbun.getText().toString());
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
});

Thread thread2 = new Thread(new Runnable(){

    @Override
    public void run(){
        try{
            synchronized(this){
                Thread.sleep(1000);
                final Button bNext = (Button) findViewById(R.id.bIsoAbunSave);
                bNext.setOnClickListener(new OnClickListener(){

                    @Override
                    public void onClick(View arg0){
                        notify();
                    }
                });
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
});

thread.start();
thread2.start();
try{
    thread.join();
}catch(InterruptedException e){
    e.printStackTrace();
}
try{
    thread2.join();
}catch(InterruptedException e){
    e.printStackTrace();
}
}
字符串arrayExtra[]={“1”};
对于(int x=0;x

这段代码应该做的是,创建2个线程,等待按钮单击,然后在按钮被单击时,执行notify(),然后继续剩下的代码。但这只是冻结屏幕。for循环不应该永远运行,但我不确定。

您正在启动单独的线程,并立即对它们调用join()。调用join()由主线程执行(因为您在onCreate中)。此方法的作用是告诉当前线程等待另一个线程完成。因此,主线程将被阻塞,直到另一个线程死亡

但是线程正在等待用户单击按钮。用户事件由UI线程处理,该线程当前在join()中被阻止。因此,单击不会被处理,事件处理程序将永远不会被调用,并且会出现死锁情况

应尽可能避免多线程,因为它会给程序增加很多复杂性,并且通常不会增加任何好处。在android中执行耗时的任务时,这是必要的,并且您不想用该任务阻塞UI线程

您可能应该删除线程,并找到其他方法来实现您想要的

更新


实际上,您的代码还有另一个问题,这也会阻止它工作:您正在同步、等待和通知不同的对象。因此,调用notify()将永远不会到达wait()中的线程,即使单击事件已被处理。

您似乎正在主线程(UI线程)中完成大部分工作。我认为您不想在此处使用join。如果您想保留此机制,可能需要一个带有条件对象的可重入锁。使用此功能,当您想要阻止线程对象时,您将能够在线程对象内部等待
并在按下按钮时发出
信号


但是,除非您想在按下按钮之前进行处理,否则在操作发生时懒洋洋地创建线程可能是一个好方法。AsyncTask可能也很值得一看。

您是否尝试添加一些日志记录?就像调用onClick方法时记录日志一样,从notify中记录日志。我认为thread.join()正在冻结ui,但是,创建一个在用户单击按钮时激活的线程有什么意义?当用户单击按钮时创建线程不是更容易吗?@lelloman当用户单击按钮时,线程没有被激活,线程已经被激活,正在等待单击。(如果我理解正确的话)代码必须这样工作。另外,如果thread.join()正在冻结ui,有没有办法将其解冻?您认为
thread.join()如何确实如此?请尝试使用AsyncTasks,而不是线程:它们是在考虑UI线程的情况下设计的。程序的工作方式是,我需要等待按钮单击,然后继续代码,我知道的唯一方法是使用线程,但这会出现问题。您知道在执行操作(单击按钮)之前暂停代码运行的其他方法吗?@user154989将要执行的代码放入按钮并单击并删除线程有什么问题您不需要线程来执行此操作。为了实现类似的功能,您应该使用按钮的事件处理程序(就像您在第二个线程中已经做的那样)。您必须将代码重组为多个部分,一部分立即在onCreate中执行,另一部分在单击按钮时执行。