标签: java-threads

Java线程状态转换,WAITING到BLOCKED还是RUNNABLE?

SO共识与互联网上几乎每个Java线程状态图之间似乎存在差异; 具体来说,关于 WAITING之后的线程状态转换notify()或被notifyAll()调用...

  • 等待永远不会直接进入RUNNABLE
  • 该线程正在等待直到通知...然后它变为 BLOCKED ...
  • 一旦通知此线程,它将无法运行 ...这 ...阻塞状态.

所以关于SO的共识是:一个线程从调用之后转换WAITING到; 或者; 下图说明了绿色的这种转变.BLOCKEDnotify()notifyAll()

为什么网上的大多数状态图都说明了转换WAITINGRUNNABLE,而不是BLOCKED?红色描绘显示错误的过渡; 我错过了什么吗?

在此输入图像描述

java multithreading thread-state java-threads

28
推荐指数
1
解决办法
9820
查看次数

java代码执行在没有断点和正常运行的调试中产生不同的结果.ExecutorService坏了吗?

TL:ExecutorService executorService = Executors.newFixedThreadPool(8); 调试中的DR 运行并发,但在正常运行时它启动并发,但后来在单线程中运行.

我有一些代码,我开始4个不同的任务ExecutorService.其中两个任务应该几乎立即完成,另外两个应该运行一段时间.

这些任务以秒为单位返回执行时间Future<Double>.

此代码负责任务执行和测量:

public Future<Double> measure(int[] arr, ProcessIntArray processIntArray, ExecutorService es) {
    Callable<Double> task = () -> {
        long start = System.nanoTime();
        processIntArray.process(arr);
        long end = System.nanoTime();
        return (end - start) / 1000000000.0;
    };
    return es.submit(task);
}
Run Code Online (Sandbox Code Playgroud)

稍后,在启动这些任务后,我将按照先前运行的相同输入大小的执行时间顺序打印它们.

    Future<Double> bubbleSortTime = measure(bubbleSortArray, Solution::bubbleSort, executorService);
    Future<Double> insertionSortTime = measure(insertionSortArray, Solution::insertionSort, executorService);
    Future<Double> quickSortTime = measure(quickSortArray, Solution::quickSort, executorService);
    Future<Double> mergeSortTime = measure(mergeSortArray, Solution::mergeSort, executorService);


    System.out.println();
    System.out.println("array size:     " + size);
    System.out.println("quick …
Run Code Online (Sandbox Code Playgroud)

java multithreading jvm executorservice java-threads

25
推荐指数
1
解决办法
2667
查看次数

为什么'extends Thread'存在,当'implements Runnable'在所有情况下都是赢家时

我知道这 implements Runnableextends Thread Java线程更受欢迎,因为它允许我们在需要时扩展其他类.但如果是这样的话,它extends Thread也有自己的优势implements Runnable,如果是的话,这些优势是什么?

java multithreading runnable java-threads

16
推荐指数
2
解决办法
1967
查看次数

什么是RMI TCP连接

我正在用java创建一个桌面应用程序,并且正在做一些内存优化.这让我遇到了在JVM中运行的两个线程,两个线程都命名为:

RMI TCP连接

他们都非常有助于堆增长(从我的角度来看)

现在我不太了解,但TCP听起来像是一些互联网的东西.从我在谷歌上找到的,它与互联网上的序列化/反序列化有关.

但我的应用程序不需要互联网,所以我想知道两件事:

  1. 它们是什么以及它们在我的JVM中做了什么?
  2. 我可以以某种方式摆脱它们吗?

在此输入图像描述

我的工具是"Java visualVM".虽然我已经想到这两个线程是由于使用这个工具而产生的,在这种情况下我会觉得有点愚蠢.

java memory heap optimization java-threads

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

DestroyJavaVM线程始终在运行

在分析我的应用程序时,我遇到了一个奇怪的行为 - DestroyJavaVM线程始终在运行 - 100%的时间.

在此输入图像描述 在对该主题进行了一些研究之后,在网上几乎没有任何有价值的信息,我所理解的是该线程应该在退出时卸载JVM.

如果是这种情况,为什么这个线程从我开始申请的第一个时刻起100%的时间处于RUNNING状态?它是否消耗了宝贵的资源,因此可能导致OutOfMemoryError(像我有时得到的)?

是否有任何关于此线程实际执行的内容以及触发其初始化的内容的官方参考?

谢谢

java multithreading jvm java-threads

13
推荐指数
1
解决办法
9393
查看次数

是否可以在Stream.parallel()中设置线程的优先级?

如果我想在后台任务中并行运行Stream,是否可以以较低优先级运行它?如果是这样怎么样?

java java-8 java-stream java-threads

11
推荐指数
1
解决办法
642
查看次数

每个线程都有堆栈空间吗?

如果我理解正确,堆栈是为了本地原始和对堆中对象的引用.那么如果你有多个线程会发生什么?

它们是否同时共享相同的堆栈空间(但不同的区域),或者JRE切换上下文并在线程之间切换时加载 - 卸载堆栈内容?

或者JRE是否为每个线程分配单独的堆栈?

java stack java-threads

10
推荐指数
2
解决办法
4283
查看次数

java中多个线程使用同一个对象会复制它吗?

Java中的多个线程如何处理传递给它们的单个对象引用

他们是复制该对象然后使用它,还是使用同一个对象?

欢迎任何技术解释。

我无法在上下文中理解这一点:如果线程将一些数据传递给对象并进入睡眠状态,而一个线程正在睡眠时,另一个线程使用同一对象将数据传递给它并进入睡眠状态。

最后一个数据会覆盖对象中的前一个数据吗?

java multithreading thread-safety thread-synchronization java-threads

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

收集 CompletableFuture.allOf() 执行中抛出的异常

有以下暂存代码:

  public static void main(String[] args) throws ExecutionException, InterruptedException {

    CompletableFuture<Void> process1 = CompletableFuture.runAsync(() -> {
      System.out.println("Process 1 with exception");
      throw new RuntimeException("Exception 1");
    });

    CompletableFuture<Void> process2 = CompletableFuture.runAsync(() -> {
      System.out.println("Process 2 without exception");
    });

    CompletableFuture<Void> process3 = CompletableFuture.runAsync(() -> {
      System.out.println("Process 3 with exception");
      throw new RuntimeException("Exception 3");
    });

    CompletableFuture<Void> allOfProcesses = CompletableFuture.allOf(process1, process2, process3);

    allOfProcesses.get();
  }
Run Code Online (Sandbox Code Playgroud)

我正在寻找如何收集并行执行期间引发的所有异常CompletableFuture.allOf()并将其映射到列表的方法。

我知道我可以通过返回异常(CompletableFuture<Exception>)而不是通过使用抛出并收集它来做到这一点CompletableFuture::join,但我认为抛出异常方法比稍后返回并抛出它更好

java asynchronous java-threads completable-future

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

如何限制创建的线程数并等待主线程直到任何一个线程找到答案?

这是查找 LCM 和 HCF 之和等于该数字的第一对数字(1 除外)的代码。

import java.util.*;
import java.util.concurrent.atomic.AtomicLong;

class PerfectPartition {
    static long gcd(long a, long b) {
        if (a == 0)
            return b;
        return gcd(b % a, a);
    }

    // method to return LCM of two numbers
    static long lcm(long a, long b) {
        return (a / gcd(a, b)) * b;
    }

    long[] getPartition(long n) {
        var ref = new Object() {
            long x;
            long y;
            long[] ret = null;
        };

        Thread mainThread = Thread.currentThread();
        ThreadGroup t …
Run Code Online (Sandbox Code Playgroud)

java parallel-processing performance multithreading java-threads

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