草庐IT

Tread多线程

全部标签

java - 当线程被中断时,BlockingQueue 方法是否总是抛出 InterruptedException?

在我的一个Java6应用程序中,我有一个线程向主线程提供数据,同时还从数据库中预取更多记录。它使用ArrayBlockingQueuequeue作为一个FIFO缓冲区,它的主循环是这样的:while(!Thread.interrupted()){if(source.hasNext()){try{queue.put(source.next())}catch(InterruptedExceptione){break;}}else{break;}}有些代码会在循环终止后进行一些清理,例如污染队列和释放任何资源,但这几乎就是全部。就目前而言,没有从主线程到供给线程的直接通信:供给线程使用适当的

java - 如何破坏这个(非?)线程安全对象?

我回复了question较早前关于线程安全的内容并没有得到明确的答案(我认为)。所以我一直试图通过让数千个线程读取和写入该对象来说服自己设计被破坏(可见性)——但我没有得到任何意想不到的东西。这显然不能证明它是线程安全的,可能只是证明我自己的局限性!我理解重新排序的风险,但我不知道它如何适用于这种情况,因为bar()方法中的clone实例是本地的,其字段的更改在使用return发布到外部世界之前完成,之后实例实际上是不可变的。因此查看返回对象的线程会看到它的bar字段已经设置为正确的值...所以我的问题是:什么样的代码你能展示一段使用IsItSafe的代码,它可能导致2个线程查看给定I

java - 多个线程将对象引用传递给静态辅助方法

我只是Java的初学者,偶然发现了多线程应用程序。我知道这个问题与此处的某些帖子类似,但我找不到更好的查询答案。基本上,我想将一个对象传递给一个静态方法,该方法将只返回一个基于对象的值/属性的输出。对于每次调用,我都会创建一个对象的新实例,并且我不可能以任何方式修改方法内部的对象。现在,我的问题是,JVM是否会为多个线程的每次调用创建静态方法的新实例及其局部变量到堆栈中(不包括将在堆上的对象)?为了清楚地了解我想要实现的目标,这是我的代码:TestConcurrent.javaimportclasses.Player;publicclassTestConcurrent{privates

java - 如何对仅使用 jUnit 启动线程的方法进行单元测试?

如标题所示,我想测试这样一个方法:publicvoidstartThread(){newThread(){publicvoidrun(){myLongProcess();}}.start();}编辑:从评论来看,我想测试线程是否启动并不是很常见。所以我必须调整问题...如果我的要求是100%的代码覆盖率,我是否需要测试该线程是否启动?如果是这样,我真的需要一个外部框架吗? 最佳答案 这可以通过Mockito优雅地完成.假设该类名为ThreadLauncher,您可以确保startThread()方法调用了myLongProcess(

java vs scala - 在单独的线程上读取文件

我想知道就行业实践而言最好的方法是使用多线程方法读取文件。在Java中,我会执行以下操作:classReader{ResultreadFile(Filefile,Listenercallback)}classListener{voidprocess(Resultr)}Reader会生成另一个线程来生成结果,然后从工作线程中回调Listener。这是一个好方法吗?这将如何转化为Scala,它可能有其他更好的机制来实现这一点? 最佳答案 Scala中的一种方法是使用并行集合。假设您有一系列文件:files:Seq[File]=...可以

java - 嵌套线程可以为父线程抛出异常吗?

我有一个Controller类和一个Monitor工作线程。Controller线程看起来像这样publicclassControllerA{publicvoidControllerA(){try{doWork();}catch(OhNoExceptione){//catchexception}publicvoiddoWork()throwsOhNoException{newThread(newRunnable(){publicvoidrun(){//NeedstomonitorresourcesofControllerA,//ifthingsgowrong,itneedstothro

java - 在多线程环境中读取的值

我正在浏览有关线程和锁的JLS文档http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.5.classFinalFieldExample{finalintx;inty;staticFinalFieldExamplef;publicFinalFieldExample(){x=3;y=4;}staticvoidwriter(){f=newFinalFieldExample();}staticvoidreader(){if(f!=null){inti=f.x;//guaranteedtosee3intj=f.y

java - java线程间通信: stopping all threads when one finishes its task

我有n个线程并行运行,每个线程都执行一些自定义逻辑。但是,我的要求是,当任何一个线程完成执行时,所有其他线程都应该停止执行并返回。实现它的最佳方法是什么?我想通过共享boolean变量来做到这一点。当任何线程完成执行时,它将设置boolean值。所有线程都定期读取此变量并在设置时退出。此外,我的自定义逻辑是一个无限循环,一旦我知道某个其他线程已完成执行,我想在当前迭代后停止执行。这样做的正确方法是什么? 最佳答案 使用ExecutorService及其.invokeAny()方法(注:也有超时的版本)。来自Javadoc:Execu

java - 线程 "main"java.util.InputMismatchException 中的异常

我需要一个java练习的帮助,我可能在这个错误上停留了2个小时。任何帮助都会很棒。Exceptioninthread"main"java.util.InputMismatchExceptionatjava.util.Scanner.throwFor(Scanner.java:909)atjava.util.Scanner.next(Scanner.java:1530)atjava.util.Scanner.nextInt(Scanner.java:2160)atjava.util.Scanner.nextInt(Scanner.java:2119)atprodavnica.Prodav

java - volatile + 不可变持有者对象 = 线程安全?

我有一个来自“javaconcurrencypratique”一书的例子,他说volatile和不可变的持有者对象提供了线程安全性。但是我不明白书上给出的例子。代码如下:publicclassVolatileCachedFactorizerextendsGenericServletimplementsServlet{privatevolatileOneValueCachecache=newOneValueCache(null,null);publicvoidservice(ServletRequestreq,ServletResponseresp){BigIntegeri=extrac