在Java中生成具有10个线程的以太坊钱包会冻结计算机

在Java中生成具有10个线程的以太坊钱包会冻结计算机,java,multithreading,cryptography,ethereum,web3-java,Java,Multithreading,Cryptography,Ethereum,Web3 Java,我正在尝试创建10万个以太坊钱包用于测试。所有人都应该使用相同的短语,因为现在没关系。我用10个线程启动了这段代码,它冻结了我的macbook,我不得不重新启动它。3个线程可以工作,但仍然非常慢(每秒生成大约6个钱包)。发生了什么?我使用的是web3j依赖关系 public EthWallets(String[] args) { File destinationDir = new File("ethwallets/"); if(args[1].eq

我正在尝试创建10万个以太坊钱包用于测试。所有人都应该使用相同的短语,因为现在没关系。我用10个线程启动了这段代码,它冻结了我的macbook,我不得不重新启动它。3个线程可以工作,但仍然非常慢(每秒生成大约6个钱包)。发生了什么?我使用的是web3j依赖关系

    public EthWallets(String[] args)
    {
        File destinationDir = new File("ethwallets/");
        if(args[1].equalsIgnoreCase("create")) {
            try {
                int count = Integer.valueOf(args[2]);
                if(count > 10)
                {
                    final int threadedCount = count / 10;
                    for(int i = 0; i < 10; i++)
                    {
                        Thread t = new Thread()
                        {
                            @Override
                            public void run() {
                                for(int j = 0; j < threadedCount; j++)
                                {
                                    create("passphph", destinationDir);
                                }
                            }
                        };
                        t.start();
                    }
                }
                else
                    for(int i = 0; i < count; i++)
                        create("passphph", destinationDir);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void create(String passPhrase, File destinationDirectory)
    {
        try {
            String path = WalletUtils.generateFullNewWalletFile(passPhrase, destinationDirectory);
//            Credentials credentials = WalletUtils.loadCredentials(passPhrase, new File(path));
//            System.out.println("address: " + credentials.getAddress());
//            System.out.println("private: " + credentials.getEcKeyPair().getPrivateKey());
//            System.out.println("public: " + credentials.getEcKeyPair().getPublicKey());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
公共钱包(字符串[]args)
{
File destinationDir=新文件(“ethwallets/”;
if(args[1].equalsIgnoreCase(“创建”)){
试一试{
int count=Integer.valueOf(args[2]);
如果(计数>10)
{
最终int threadedCount=计数/10;
对于(int i=0;i<10;i++)
{
线程t=新线程()
{
@凌驾
公开募捐{
对于(int j=0;j
我建议您从


正如他所说,您可以生成的线程数量取决于您的线程是否执行任何I/O操作。如果是这样的话,有一些方法可以优化这个问题。如果不是,我通常会执行MAX_THREADS=N_CORES+1。

因为您运行的线程太多,处理器无法处理?使用更少的线程或更好的处理器真的有那么多计算吗?你说你的问题是你的macbook冻结了。单独的计算可能不是很密集,但100000个计算之后,每个都是。我假设你有一台配备双核处理器/超线程的笔记本电脑,所以这项任务会使每个线程都达到最大,为操作系统和用户界面留下很少的空间。那么你真的认为一台CPU每秒不能产生超过6个钱包吗?您是否意识到单个钱包只需执行很少的加密功能?我非常确定该库使用了
SecureRandom
,大量使用可能会导致