小编T T*_*T T的帖子

Java-使用invokeAll按顺序获取未来结果,但仅限于某些线程

我...真的不知道如何更好地说出标题.但基本上,我所拥有的是一个线程池,所有这些线程忙着工作.我希望他们按照分配的顺序报告他们的结果,但同时,我想分批工作.为了说明,并举例说明

ExecutorService exec = Executors.newFixedThreadPool(8);

class MyCallable implements Callable<byte[]> {
    private final int threadnumber;

    MyCallable(int threadnumber){
        this.threadnumber = threadnumber;
    }

    public byte[] call() {
        //does something
    }
}
List<Callable<byte[]>> callables = new ArrayList<Callable<byte[]>>();

for(int i=1; i<=20; i++) {
    callables.add(new MyCallable(i));
}
try {
    List<Future<byte[]>> results = exec.invokeAll(callables);
    for(Future<byte[]> result: results) {
            System.out.write(result.get(), 0, result.get().length);
    }
Run Code Online (Sandbox Code Playgroud)

基本上,池线程有8个线程,我最终有20个任务(这些只是示例).如果我理解正确的话,它现在的工作方式是它等待所有20个任务完成后再按顺序输出它们(从1到20).该程序应该做的是输出连续的字节流(由线程处理,因为我需要保持顺序完整,我使用了未来的接口).虽然我不介意等到完成所有20个任务,但无论如何都要让线程按顺序输出.

如果没有办法,或者我只是完全误解了invokeAll的工作方式,那么澄清也是受欢迎的.提前谢谢!执行官有点混乱,因为我刚刚了解了它们.

随机附录,我甚至可以从一个可调用的函数返回一个字节数组?

java future threadpool executors

4
推荐指数
1
解决办法
6779
查看次数

将字节插入字节数组

我真的不敢相信我问这个,但我读到的一切都是从int转换为byte到string转换为byte或者其他东西.我真的试图将一个字节插入一个字节数组.或者就此而言,使用字节初始化字节数组,而不是整数.

byte[] header = {0x8b, 0x1f, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03};
Run Code Online (Sandbox Code Playgroud)

编译器抱怨它们是整数.我正在尝试插入字节.

java byte bytearray

4
推荐指数
1
解决办法
4645
查看次数

使用argv访问参数

这是我一直在测试的东西,只是打印出一堆东西,但有一个案例,由于某种原因,我无法弄清楚.

我需要将一个整数作为参数传递给稍后要使用的函数,但是当我再次将其打印出来以确保我正确存储它时,我得到一个随机数.这是代码的相关部分:

int num_bytes = argv[1]; 
....
printf("Max number of bytes: %d", num_bytes);
Run Code Online (Sandbox Code Playgroud)

我只向函数传递了一个参数,这是一个int.我也尝试将argv [1]作为int进行转换,但这也没有用.我不确定这是否是printf的问题.如果就是这样,我不介意.我只需要知道我正确地将值存储为int.我知道argv是一个指向字符串的指针数组(我认为C字符串?)但我认为你可以将字符强制转换为整数.

c argv

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

Java-将完成的线程对象分配给新线程

好吧,标题的措辞有点奇怪,但我真的不知道如何表达它.基本上,从我对Java和线程的理解是你创建一个线程,它运行,它死了.但是,线程OBJECT仍然存在.如果这样的事情有效,我想知道什么

int numWorkers = Integer.parseInt(args[0]);
int threadPoolSize = Integer.parseInt(args[1]);
ExecutorService tpes = Executors.newFixedThreadPool(threadPoolSize);
WorkerThread[] workers = new WorkerThread[numWorkers];
while(some condition)    
    for (int i = 0; i < numWorkers; i++) {
        workers[i] = new WorkerThread(i, *some changing parameters*);
        tpes.execute(workers[i]);
    }
Run Code Online (Sandbox Code Playgroud)

基本上这种情况是我们有一些条件,我们不知道何时会满足.假设我使用8个线程.我创建所有8个线程,他们做他们的事情并返回.我把他们的结果放在一起,意识到我还没有完成.但是,例如,worker [0]已经存在.我用一个新的WorkerThread()调用创建了它.但它现在已经死了,因为它已经完成了.如果我打电话,AGAIN,工人[0] =新的WorkerThread(0,新参数)......是允许的吗?我需要更多线程,我已经有一个已经(现在)死线程的数组......我可以将它们指向其他东西吗?GC是否正确收集旧线程?

java multithreading threadpool

0
推荐指数
1
解决办法
164
查看次数

标签 统计

java ×3

threadpool ×2

argv ×1

byte ×1

bytearray ×1

c ×1

executors ×1

future ×1

multithreading ×1