Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.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 notifyall()之后未返回线程_Java_Android_Multithreading - Fatal编程技术网

Java notifyall()之后未返回线程

Java notifyall()之后未返回线程,java,android,multithreading,Java,Android,Multithreading,我是Java多线程新手。我做了一些研究,阅读了一些教程,做了一些测试,但我还是被这个问题困扰着。基本上,我正在设置一个游戏的框架,我希望有一个主活动类,一个包含方法的线程类,执行缓慢的操作(读取文件并将内容解压缩到缓冲区),还有一个线程是游戏循环对UI操作的反应 首先,我有一个主活动类,它实例化并启动一个单独的线程: 公共类实验活动扩展了活动{ //这只是一个容器类,包含一些成员数据,如ByteBuffers和数组 TestClass tclass=新的TestClass(此); //主循环线程

我是Java多线程新手。我做了一些研究,阅读了一些教程,做了一些测试,但我还是被这个问题困扰着。基本上,我正在设置一个游戏的框架,我希望有一个主活动类,一个包含方法的线程类,执行缓慢的操作(读取文件并将内容解压缩到缓冲区),还有一个线程是游戏循环对UI操作的反应

首先,我有一个主活动类,它实例化并启动一个单独的线程:

公共类实验活动扩展了活动{
//这只是一个容器类,包含一些成员数据,如ByteBuffers和数组
TestClass tclass=新的TestClass(此);
//主循环线程
主循环线程循环;
线程主循环;
//启动将触发引擎操作的主循环线程
loop=新的MainLoopThread(tclass);
mainLoop=新线程(循环);
mainLoop.start();
loop.setRunning(true);
(...)
}
然后,我有了
MainLoopThread
类,它实现了游戏逻辑的线程:

public类MainLoopThread实现可运行{
公共运行;
私有测试类基础数据;
//用于数据加载/解包的线程(下面的类定义)
GFXUnpack数据解包;
线程数据挖掘线程;
公共MainLoopThread(TestClass testClassStructure){
运行=错误;
baseData=testClassStructure;
}
公共void setRunning(布尔运行){
if(run==true)
{
//启动管理加载和解压缩图形的线程
dataUnpack=new-GFXUnpack(baseData.filepack[0]);
dataUnpack线程=新线程(dataUnpack);
dataUnpupThread.start();
dataUnpack.setRunning(true);
fileOpened=false;
//打开GFX数据包文件
试一试{
已同步(此){
数据解包。设置操作(2);
Log.d(“MainLoopThread”,“文件打开:等待…”);
while(dataUnpack.fileOpened==false){
等待();
}
Log.d(“MainLoopThread”,“文件打开等待完成”);
}
如果(dataUnpack.outCode==-1)
Log.d(“MainLoopThread”,“文件打开错误!!”);
else fileOpened=true;
Log.d(“MainLoopThread”,“文件打开完成”);
} 
捕获(异常扩展){
Log.d(“MainLoopThread”,“文件打开代码异常!!”+exp);
}
}
如果(dataUnpack.running==true)dataUnpack.setRunning(false);running=run;
}
// ------------------------------------
//这是主循环线程。所有与加载相关的事件
//然后把图形解包到这里
公开募捐{
(跑步时){
已同步(此){
//----读取GFX数据包并更新纹理像素
如果(fileOpened==true){
试一试{
//(做点什么…)
等待();
}捕获(异常扩展){
Log.d(“MainLoopThread”,“抛出异常!!”+exp);
}
}
}//(线程输出代码已删除。无论如何,它从未在此处传递)
}         
最后是
GFXUnpack
thread类,其中包含打开SD卡上文件的代码, 读取其中的内容并写入缓冲区:

公共类GFXUnpack实现可运行{
// -------------    
公共布尔运行=false;
私有文件数据fdata;
私有整数运算=0,参数=0;
公共图书馆开放;
public int outCode;//用于向调用方发出操作结果的信号
// ------------------------------
公共GFXUnpack(文件数据包数据结构){
this.fdata=packetDataStructure;
}
// --------
公共void setRunning(布尔运行){
running=run;operation=0;fileOpened=false;
outCode=0;参数=0;
}
// --------
公共无效设置操作(int op){
操作=op;
}
// ---
公共无效设置操作(int op,int parm){
操作=op;
参数=parm;
}
// ---------    
公共同步的无效运行(){
(跑步时){
试一试{
开关(操作){
案例(2)://打开gfx数据文件
(…做事…)
打破
}
// ---------
试一试{
(…在这里做一些事情…)
Log.d(“GFXUnpack”、“映射文件”);
(…在这里做一些事情…)
Log.d(“GFXUnpack”,“映射文件”);
fileOpened=true;
outCode=1;
}捕获(例外e){
Log.d(“GFXUnpack”,“文件打开异常!!”+e);
outCode=-1;
}
最后{
操作=0;参数=0;
notifyAll();
Log.d(“GFXUnpack”,“通知文件打开”);
}
}
打破
// ----------------
}
//----这里还有其他案例。。。
}最后{
}
}
}
运行上述程序时,调试器输出为:

MainLoopThread文件打开:正在等待…
GFXUnpack映射文件
GFXUnpack映射文件
GFXUnpack已通知文件打开

然后,应用程序挂起,我必须强制关闭它。我想,由于我在
GFXunpack
run()
方法中调用
notifyAll()
(在
finally{}
块中),调用方线程(MainLoopThread)将