我想有一个布尔值来通知系统某些特定服务启动的部分.
由于一些奇怪的原因,我收到了错误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
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()都给我找不到符号.
我开始为遗留代码库编写JUnit测试用例.其中一个公共方法有多个if语句,并且基于一个条件,它调用不同的私有方法.
我应该只编写一种测试方法并测试所有条件吗?或每种情况的一种方法?
如果我为每个if条件编写单独的方法,我不会失去一致性吗?
测试私有方法的方法是什么?私有方法逻辑可能比公共方法更复杂.
我正在尝试使用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) 我在项目中有分层的架构,例如Controller-> Service-> DAO。我想为服务层编写JUnit测试用例。现在,由于服务层将在内部调用DAO方法,所以为什么要在内部测试DAO层时编写不同的测试用例。
有人说,我需要使用Mockito模拟DAO方法。真的需要吗?不能在测试服务层方法时直接使用原始代码吗?
我们不能直接在线程的对象上调用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
我有一个方法可以在执行 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()?
我通过创建固定数量的线程来执行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 7的try-with-resources消除了对那个讨厌的finally块关闭资源的需要.我个人认为它更优雅,但我有一个不相信的同事.他不喜欢一个例外被压制,并且一直在争论我们通过它来丢失信息.
起初我接受了他的话,因为我是一个初级开发者,他是高级,我是新人,等等.但我最近发现,嘿,所有信息都进入堆栈跟踪,包括被抑制的异常.所以没有信息丢失.
我正在寻找的这场辩论的最后一部分(因为我主张尝试使用资源)是自动关闭处理异常的方式.假设在尝试关闭资源时抛出异常,资源是否可能保持打开和泄漏?最终这可能不是什么大问题,因为无论如何日志都会提醒我们这个问题.
只是好奇.非常感谢.
java ×7
java-threads ×2
junit ×2
junit4 ×2
unit-testing ×2
cassandra ×1
concurrency ×1
cql3 ×1
exception ×1
groovy ×1
locking ×1
synchronized ×1
threadpool ×1
tomcat ×1