簡體   English   中英

Java:從線程中獲取值......?

[英]Java:Get a value from a thread…?

如何從thead返回變量(我也有線程處理)。 在這種情況下,靜態變量不起作用。

更新 :這是一個轉折點,如何在不必阻塞並等待結果的情況下執行此操作? 我需要能夠輪詢創建的線程並在它掛起太長時間(例如> 1分鍾)時將其終止,然后如果生成的線程花費的時間太長則繼續在主線程中。

使用Callable<V>而不是Thread (或Runnable ),以便您可以將結果作為Future<V>並使用ExecutorService來調用它。

這是一個SSCCE ,只是復制'n'paste'n'run它:

package com.stackoverflow.q2413389;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Test {

    public static void main(String... args) throws Exception {
        ExecutorService executor = Executors.newCachedThreadPool();
        List<Future<String>> results = executor.invokeAll(Arrays.asList(new Task()));
        for (Future<String> result : results) {
            System.out.println(result.get()); // Prints "myResult" after 2 seconds.
        }
        executor.shutdown();
    }

}

class Task implements Callable<String> {

    public String call() throws Exception {
        Thread.sleep(2000); // Do your running task here, this example lasts 2 seconds.
        return "myResult";
    }

}

更新 :根據您的更新,如果在超時后如何終止它,請使用ScheduledExecutorService 這是稍微改變的代碼:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
List<Future<String>> results = executor.invokeAll(Arrays.asList(new Task()), 1, TimeUnit.SECONDS); // Timeout of 1 second.
for (Future<String> result : results) {
    if (!result.isCancelled()) {
        System.out.println(result.get()); // Won't be printed as the "actual" processing took 2 seconds.
    } else {
        System.out.println("Task timed out.");
    }
}
executor.shutdown();

如果我理解你的問題(如何訪問線程對象的成員值),你可以使用這個簡單的方法:

MyObject a = new MyObject(); new Thread(a).start();

只需記住為MyObject實現Runnable接口並擁有適當的Getters。

如果您想要返回一個變量,您可以在類中創建一個成員並執行一個while循環,直到該線程完成執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM