草庐IT

Multithreading

全部标签

java - 其他线程中的忙循环延迟了 EDT 处理

我有一个Java程序,它在一个单独的(非EDT)线程上执行一个紧密循环。虽然我认为SwingUI应该仍然是响应式的,但事实并非如此。下面的示例程序展示了这个问题:单击“试试我”按钮应该会在大约半秒后弹出一个对话框,并且应该可以通过单击它的任何响应立即关闭该对话框。相反,对话框需要更长的时间才能出现,和/或在单击其中一个按钮后需要很长时间才能关闭。问题出现在Linux(两台具有不同发行版的不同机器)、Windows、RaspberryPi(仅限服务器VM)和MacOSX(由另一位SO用户报告)上。Java版本1.8.0_65和1.8.0_72(都试过了)具有多核的i7处理器。EDT应该有

java - 如何杀死等待Java中阻塞函数调用的线程?

我有一个主题:Threadt=newThread(){publicvoidrun(){ServerSocketConnectionscn=(ServerSocketConnection)Connector.open("socket://:1234");//Waitforaconnection.SocketConnectionsc=(SocketConnection)scn.acceptAndOpen();//dootheroperation}};t.start();假设没有客户端连接到服务器,那么这个线程将被阻塞。现在我想杀死上面的线程t?我怎样才能杀死它?

java - 在 Java 中动态更改处理线程的名称是个好主意吗?

我们有一个处理请求的Java应用程序。自然地,有一个线程池,其中的线程以一些无关紧要的名称命名,如“processor-1”、“processor-2”等。我们想知道每次收到对名称的请求时重命名处理线程是否是个好主意这将指示正在处理哪个请求。我觉得这件事有问题,但想不出一个好的理由。我记得几个从线程转储中分析多线程问题的案例,知道我是否在两个连续的转储中看到同一个线程对我来说非常重要。但是,我意识到我可以改为查看线程ID。在log4j日志中,写线程名称是一种常见的做法,我记得很多情况下都是通过它进行过滤的。但我仍然不确定我在这里是否有良好的“防线”。常见的做法是什么?继续重命名线程是个

Windows XP 与 Windows 7 上的 Java 计时精度

我有一个奇怪的问题-我希望有人能向我解释发生了什么以及可能的解决方法。我正在用Java实现Z80核心,并试图通过在单独的线程中使用java.util.Timer对象来降低它的速度。基本设置是我有一个线程运行一个执行循环,每秒50次。在此执行循环中,执行了多少个循环,然后调用了wait()。外部定时器线程将每20毫秒在Z80对象上调用notifyAll(),模拟3.54MHz(ish)的PALSega主系统时钟频率。我上面描述的方法在Windows7上完美运行(试过两台机器),但我也试过两台WindowsXP机器,在这两台机器上,Timer对象似乎睡过头了大约50%左右。这意味着在Win

java - volatile 和 synchronized 在一起

是否有任何理由在此代码中同时使用volatile和synchronized?publicclassHelper{privatevolatileintn;privatefinalObjectlock=newObject();publicHelper(intn){this.n=n;}publicvoidsetN(intvalue){synchronized(lock){n=value;}}}类助手必须是线程安全的。我从《JavaConcurrencyGuidelines》一书中得到了这个例子,但还是不清楚:这个例子中为什么要同时使用volatile和synchronized?

Java 8 自动使用多核?

我一年前用java7做了一些关于多核的测试。首先我只在主线程中实现了一些计算(CPU使用率显示只有一个内核完成了所有工作)然后我用一个ExecutorService实例实现了Callable。在运行它时,所有核心都在工作。现在,一年后,我必须实现一个小程序(使用java8)来插入大量数据。所有工作都在主线程中实现(没有Callable和ExecutorService),但是当我运行程序时,CPU使用率显示所有4个内核都为98%。那么java8会自动分配所有CPU核心上的工作吗?我很困惑...这里有一些代码...map生成器.javaRegion[][]regions=newRegion

java - 如何实现线程安全的收集器?

我想要类似于Collectors.maxBy()的东西,一个获取集合中顶部元素的收集器(maxBy只获取一个)。我有一个Possibility的流可以用Integerscore(Possibility)评分的对象方法。首先我尝试了:Listpossibilities=getPossibilityStream().parallel().collect(Collectors.toList());if(!possibilities.isEmpty()){intbestScore=possibilities.stream().mapToInt(p->score(p)).max().getAsI

java - 并行转换流时如何使用收集器

我实际上试图回答这个问题HowtoskipevenlinesofaStreamobtainedfromtheFiles.lines.所以我认为这个收集器不能很好地并行工作:privatestaticCollector>oddLines(){int[]counter={1};returnCollector.of(ArrayList::new,(l,line)->{if(counter[0]%2==1)l.add(line);counter[0]++;},(l1,l2)->{l1.addAll(l2);returnl1;});}但它有效。编辑:它实际上没有用;我被我的输入集太小而无法触发任

java - 如何在单元测试中避免 Thread.sleep?

假设我有以下应该测试的方法:@AutowiredprivateRoutingServiceroutingservice;publicvoidmethodToBeTested(){ObjectobjectToRoute=initializeObjectToRoute();if(someConditions){routingService.routeInOneWay(objectToRoute);}else{routingService.routeInAnotherWay(objectToRoute);}}在这种情况下,RoutingService在单独的线程中运行,因此在它的构造函数中我

java - 从 Junit 运行时,System.out.print 不会输出到控制台

运行时:publicstaticvoidmain(String...args)throwsInterruptedException{while(true){System.out.print(".");Thread.sleep(200);}}对比从junit运行相同的代码时:@Testpublicvoidtest()throwsException{while(true){System.out.print(".");Thread.sleep(200);}}有不同的行为:对于main()-当进程运行时,输出按预期显示("."->".."->"...")但是,对于JUnit,当运行同一段代码时