java - 在线程内创建线程 - 好的做法?

标签 java multithreading

<分区>

在一个线程中启动一个线程是好的做法吗?我四处搜索,但没有找到太多信息。

我有一个 TimerTask,它每天在特定时间获取用户列表。然后我想获取有关用户的一些数据,但这需要用户输入。因为它需要用户输入,所以我不希望我的 TimerTask 线程在用户没有响应的情况下被阻塞。例如,列表中的第一个用户可能不会在 X 时间内响应,我不想等待 X 时间直到我向第二个用户询问他们的数据,等等。因此,在我的 TimerTask 中,我创建并启动了一个新线程来获取数据。这样,在 Y 时间内,如果我收到了一些数据(但不是全部),我仍然可以做其他事情,而不是等待每个数据都完成。

执行上述操作是好的做法吗?有没有更好的解决方案?

这是一些伪代码,可以帮助您理解。

class UserThread extends TimerTask {

        @Override
        public void run() {
            log.debug("Get a list of members!");
            List<String> users = userManager.getUsers();
            retrieveInitialData(users);
        }

        public void retrieveInitialData(List<String> users) {
            for(String user : users) {
                new Thread(new GetData(user)).start();
            }
        }

        addToSuccessList(String user) {
            synchronized(successList) {
                successList.add(user);
            }
        }

        addToFailureList(String user) {
            synchronized(failureList) {
                failureList.add(user);
            }
        }

        class GetData extends Thread {

            String userID;

            public GetData(String user) {
            this.userID = user;
            }

            public void run() {
            try {
                dataManager.getData(user);
                addToSuccessList(user);
            } catch(Execption e) {
                addToFailureList(user);
            }

        }

最佳答案

更好的方法是使用 ThreadPoolScheduledExecutorService。从一个线程开始一个线程本质上并不是坏事(毕竟一切都在一个线程内运行,所以您需要在某个地方这样做!)但可能表明您的设计存在缺陷。

关于java - 在线程内创建线程 - 好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21883236/

相关文章:

java - 原始 float 到 int 的转换是可能的,但对于引用类型是不可能的,为什么?

multithreading - 从另一个线程修改局部变量是什么意思?

c++ - 如何处理请求时可能不会终止的线程?

c - 如何使用 POSIX 线程在 C 语言中创建特定于线程的全局变量?

python - 你如何终止/中断/中止 Python 控制台/sys.stdin readline()?

java - 单选按钮和文本框事件处理

java - 更改 Android 警报对话框中当前选定项目的颜色

java - 如果发生异常,Java 线程是否需要清理

java - 使用 Gradle 构建 Python 应用程序

java - 是否可以创建一个引用图片的数组