相关疑难解决方法(0)

停止/销毁线程

我有一个启动Thread和Runnable的服务.

t = new Thread(new Runnable() {
    public void run() {
        doSomething();
    }
});

t.start();
Run Code Online (Sandbox Code Playgroud)

该线程的原因是执行异步任务doSomething().现在让我们不要担心其他类AsyncTask.我已经尝试过它并不适用于我的情况.编辑:我不能使用AsyncTask,因为它仅适用于UI线程.这段代码必须在服务内部运行,所以nope,没有AsyncTask :(

doSomething()包含一些外部库,所以我遇到的问题是它可能挂在其中一个命令上,而不返回任何值(因此甚至不能进行错误检查)

为解决这个问题,我希望在某些时候破坏服务.

stopService(new Intent("net.MyService.intent));
Run Code Online (Sandbox Code Playgroud)

这很好,很容易在手机上验证.但是,即使生成它的服务被销毁,上面创建的Thread也将继续运行.

因此,我正在寻找在Service的onDestroy()中插入的正确命令,它将为我清理Thread.

t.destroy();
t.stop();
Run Code Online (Sandbox Code Playgroud)

都折旧并导致应用程序崩溃.

我从某个地方拿了这个代码

@Override
public void onDestroy() {

    Thread th = t;
    t = null;

    th.interrupt();

    super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)

但它仍然无效,线程继续运行.有帮助吗?

service multithreading android

19
推荐指数
2
解决办法
3万
查看次数

从.war文件加载类的顺序

我有一个关于保证的问题,如果有的话,在下面的场景中(请注意问题不是"如何以不同的方式做到这一点?"),问题实际上是关于以下情况下的类加载顺序(至更好地理解类加载的工作原理).

这是假设的场景......有一个.war文件,它具有以下(部分)目录结构:

 WEB-INF/classes/com/acme/Bunny.class
 .
 .
 .
 WEB-INF/lib/acme.jar
Run Code Online (Sandbox Code Playgroud)

两个Bunny.class文件都有导入引用acme.jar中的其他类

Bunny.classWEB-INF /班/ ...是具有相同的名称/路径,一个类从唯一的类acme.jar.

的.jar文件acme.jar还包含com.acme.Bunny(也有使用没有特殊的类装载器的技巧).

我知道Java规范保证在程序实际使用(或者故意"手动加载")之前不会加载类,这就是为什么如果你填充成千上万的.jar,比如说.war,类加载器不会开始类加载数万个类.

(编辑)

但是上面示例中的两个类的加载顺序又如何呢?

应该措辞:

但是如何确定上面两个类中的哪一个被加载?

或类似的东西 :)

有做一个保证:com.acme.Bunny不得将任何其它类之前,使用com.acme ....

基本上,在维基百科上,写了以下内容:

最复杂的JAR地狱问题出现在利用类加载系统的完全复杂性的情况下.Java程序不需要仅使用单个"平面"类加载器,而是可以由几个(或实际上是无限数量)嵌套的协作类加载器组成.由不同类加载器加载的类可能以复杂的方式进行交互,而开发人员无法完全理解这些类,从而导致无法解释的错误或错误.

所以我想知道:我可以确定/classes/com/acme/Bunny.class是否会在WEB-INF/lib / dir中的.jar之前进行类加载?

java web-applications classloader

14
推荐指数
3
解决办法
2万
查看次数

8
推荐指数
2
解决办法
1万
查看次数