小编Nat*_*hes的帖子

在notifyAll()之前未被线程锁定的同步对象

我想有一个布尔值来通知系统某些特定服务启动的部分.

由于一些奇怪的原因,我收到了错误java.lang.IllegalMonitorStateException: object not locked by thread before notifyAll().

奇怪的是,notifyAll()位于一个synchronized块内,该块控制我调用notifyAll()的对象.

我的班级开头是这样的:

public class MyService {

    public static Boolean notifier = Boolean.valueOf(false);

    @Override
    public void start() {
        synchronized (MyService.notifier) {
            MyService.notifier = Boolean.valueOf(true);
            MyService.notifier.notifyAll();
        }
    }

    @Override
    public void stop() {
        synchronized (MyService.notifier) {
            MyService.notifier = Boolean.valueOf(false);
            MyService.notifier.notifyAll();
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我正在研究一个Android应用程序.我认为它不应该影响任何事情,但是如果影响java的工作方式,我会用该注释补充问题.

如果对象锁定在同步块中,为什么会出现异常?

java multithreading synchronization synchronized java-threads

5
推荐指数
1
解决办法
9669
查看次数

尝试关闭I/O对象时"找不到符号"

public static int howMany(String FileName)
{
    BufferedReader br = null;

    try
    {
        FileInputStream fis = new FileInputStream(FileName);
        DataInputStream dis = new DataInputStream(fis);
        br = new BufferedReader(new InputStreamReader(dis));
    }
    catch (FileNotFoundException e)
    {
        System.out.print("FILE DOESN'T EXIST");
    }
    finally
    {
        fis.close();
        dis.close();
        br.close();
    }


    String input;
    int count = 0;

    try
    {

        while ((input = br.readLine()) != null)
        {
            count++;
        }

    }
    catch (IOException e) 
    {
        System.out.print("I/O STREAM EXCEPTION");
    }


    return count;
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我无法关闭任何I/O对象.即使我导入了所有的I/O库(导入java.io.*;)并启动了所有对象,fis.close(),dis.close(),br.close()都给我找不到符号.

java exception-handling

5
推荐指数
1
解决办法
3014
查看次数

Junit最佳实践:调用多个私有方法的公共方法

我开始为遗留代码库编写JUnit测试用例.其中一个公共方法有多个if语句,并且基于一个条件,它调用不同的私有方法.
我应该只编写一种测试方法并测试所有条件吗?每种情况的一种方法?

如果我为每个if条件编写单独的方法,我不会失去一致性吗?

测试私有方法的方法是什么?私有方法逻辑可能比公共方法更复杂.

java junit unit-testing junit4

5
推荐指数
1
解决办法
1026
查看次数

从CQL导出数据时出现RPC超时错误

我正在尝试使用CQL客户端从cassandra导出数据.列族中包含大约100000行.当我使用COPY TO命令将dta复制到csv文件时,我得到以下rpc_time out错误.

copy mycolfamily to '/root/mycolfamily.csv'
Request did not complete within rpc_timeout.
Run Code Online (Sandbox Code Playgroud)

我在跑:

[cqlsh 3.1.6 | Cassandra 1.2.8 | CQL spec 3.0.0 | Thrift protocol 19.36.0]

如何增加RPC超时限制?

我尝试rpc_timeout_in_ms: 20000在我的conf/cassandra.yaml文件中添加(defalut是10000).但是当重新启动cassandra时,我得到:

[root@user ~]# null; Can't construct a java object for tag:yaml.org,2002:org.apache.cassandra.config.Config; exception=Cannot create property=rpc_timeout_in_ms for JavaBean=org.apache.cassandra.config.Config@71bfc4fc; Unable to find property 'rpc_timeout_in_ms' on class: org.apache.cassandra.config.Config
Invalid yaml; unable to start server.  See log for stacktrace.
Run Code Online (Sandbox Code Playgroud)

cassandra cql3

5
推荐指数
1
解决办法
5388
查看次数

服务和DAO层的JUNIT测试

我在项目中有分层的架构,例如Controller-> Service-> DAO。我想为服务层编写JUnit测试用例。现在,由于服务层将在内部调用DAO方法,所以为什么要在内部测试DAO层时编写不同的测试用例。

有人说,我需要使用Mockito模拟DAO方法。真的需要吗?不能在测试服务层方法时直接使用原始代码吗?

junit unit-testing junit4

5
推荐指数
1
解决办法
5448
查看次数

直接在线程对象上调用Runnable的run()方法

我们不能直接在线程的对象上调用Runnable的run()方法,但是根据下面的程序,我们没有任何编译或运行时错误.为什么会这样?

public class ThreadCheck implements Runnable {

    @Override
    public void run() {
        for (int i=0; i<10; ) {
            System.out.println(++i);
        }
    }

    public static void main(String[] args) {
        Thread mythread = new Thread(new ThreadCheck());
        mythread.run();
        mythread.run();
        mythread.start();
    }   
}
Run Code Online (Sandbox Code Playgroud)

输出:1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10

java multithreading

5
推荐指数
1
解决办法
2468
查看次数

(术语)"争用"与"满足"锁定

在讨论"满足"锁和"争用"锁时,有什么区别,如果有的话.

我最近在关于锁定的讨论中第一次听到"contented"这个词,显然这两个术语的使用频率几乎相同:
满意的 367,000个结果
争用 353,000个结果

"争论"和"争辩"对我有意义,因为它们是冲突中的意思,但"满足"意味着满足/平静,所以让我感到困惑.

concurrency multithreading locking

5
推荐指数
1
解决办法
791
查看次数

如何阻止线程继续执行无限循环

我有一个方法可以在执行 Groovy 脚本后返回 HTTP 响应。我创建了一个匿名线程来执行 Groovy 脚本。但是,作为预防措施,我希望线程在 3 秒后停止,以防止不良脚本(即:无限循环)继续运行。

public Response runScript(String script) {
    GroovyShell shell = new GroovyShell();
    Thread thread = new Thread() {
       public void run() {
           Script validatedScript = shell.parse(script);
           validatedScript.run();
       }
    };
    thread.start();
    thread.join(3000);
    return Response.ok("It ran!", MediaType.TEXT_PLAIN).build();
}
Run Code Online (Sandbox Code Playgroud)

此代码适用于没有无限循环的脚本。但是,如果存在无限循环,则响应“It ran!” 已交付给客户端,但线程仍处于活动状态。我如何在之后杀死这个线程join()

java groovy multithreading java-threads

5
推荐指数
1
解决办法
3116
查看次数

如何在Tomcat停止时停止执行程序线程?

我通过创建固定数量的线程来执行HTTP GET数据检索来使用执行程序服务.

executorService = ExecutorServiceFactory.getInstance().getExecutorService(Config.getInstance().getNumberOfThreads(), "ThreadExecutor_"+UIDFactory.getInstance().createSessionID());
executorService.execute(new Retrieve(data));

private class Retrieve implements Runnable{
    private Vector<String> data;

    public WADORetrieve(Vector<String> data) {          
            this.data = data;
    }

    @Override
    public void run() {
        for(int i=0;i<data.length;i++){
            fetch(data[i]);
        }
    }
}    
Run Code Online (Sandbox Code Playgroud)

当Tomcat停止时,我们收到此错误:

严重:Web应用程序[/ viewer]似乎已经启动了一个名为[ThreadExecutor_5161616156]但未能阻止它的线程.这很可能造成内存泄漏.

这是一个真正的问题吗?如果没有这些服务错误,我该怎么做才能正常停止tomcat.

java multithreading tomcat executorservice threadpool

5
推荐指数
1
解决办法
6845
查看次数

Java Try-With-Resources辩论

好了,在我的工作中,我们正在讨论试用资源和异常抑制.

快速回顾:来自java 7的try-with-resources消除了对那个讨厌的finally块关闭资源的需要.我个人认为它更优雅,但我有一个不相信的同事.他不喜欢一个例外被压制,并且一直在争论我们通过它来丢失信息.

起初我接受了他的话,因为我是一个初级开发者,他是高级,我是新人,等等.但我最近发现,嘿,所有信息都进入堆栈跟踪,包括被抑制的异常.所以没有信息丢失.

我正在寻找的这场辩论的最后一部分(因为我主张尝试使用资源)是自动关闭处理异常的方式.假设在尝试关闭资源时抛出异常,资源是否可能保持打开和泄漏?最终这可能不是什么大问题,因为无论如何日志都会提醒我们这个问题.

只是好奇.非常感谢.

java exception-handling exception try-with-resources

5
推荐指数
1
解决办法
689
查看次数