当前位置: 首页 > 知识库问答 >
问题:

Java中的Executor服务-->如何将单线程代码转换为使用Executor

陶裕
2023-03-14
private Thread spawnThread( )
    {

        Thread t = new Thread()
        {
            String taskSnap = task.toString();
            public void run()
            {
                try
                {
                    println( task.run( null ) );
                }catch( InterruptedException e )
                {
                    println( "ITC - " + taskSnap + " interrupted " );
                }
            }
        };
        return t;
    }
    taskThread = spawnThread();

    taskThread.start();

我想做的是,创建一个executor服务(具有固定数量的线程)-->,然后将新线程的创建/新线程的任务执行移交给该executor。

由于我对Executor非常陌生,所以我想知道的是,我如何更改上面的代码,以便不是形成一个新的单独的线程,而是在线程池中创建一个新线程。我看不到任何创建线程的命令(在线程池中)-->将上面的任务移交给那个线程(而不是像上面那样移交给一个独立的线程)。

请告诉我如何解决这个问题。

共有1个答案

阎宝
2023-03-14

在您的主要内容中,您可以这样写:

ExecutorService executor = Executors.newFixedThreadPool(nThreads);
executor.submit(new Runnable() {
    String taskSnap = task.toString();
    public void run() {
            try {
                println(task.run(null));
            } catch( InterruptedException e) {
                println("ITC - " + taskSnap + " interrupted ");
            }
    }
});

submit方法将在executor服务中的一个线程上执行Runnable。

注意:当您不再需要executor服务时,不要忘记关闭它,否则它将阻止您的程序退出。

 类似资料:
  • 我只是想知道是否有可能替换用Java的Executor服务编写的旧的多线程代码到Akka。我对此没有什么疑问。 目前我使用固定线程池多线程,并提交一个可调用的。 示例代码, 但没有解释它如何变得比线程更快? 我尝试了一些示例Akka(activator中的Akka示例)代码,并在所有Actor中打印了Thread.currentThread.getName,发现创建了名为(helloakka-ak

  • 我有一个服务层类,它有annotation@Controller和我在线程中生成的服务调用,它正在更新数据库中的某些内容。我在thread的方法中使用了@transaction注释。但我遇到了hibernate异常“找不到会话”。我需要为线程添加任何注释吗? lient.runHibernateException:在lient.java:222没有找到当前线程的Session 4. SpringS

  • 问题内容: 我正在将Java库移植到C#。我使用的是Visual Studio 2008,因此没有停止使用的Microsoft Java语言转换助手程序(JLCA)。 我的方法是创建一个与Java库具有类似项目结构的新解决方案,然后将Java代码复制到ac#文件中,并将其逐行转换为有效的c#。考虑到我觉得Java易于阅读,两种语言之间的细微差别使我感到惊讶。 有些事情很容易移植(命名空间,继承等)

  • 当我的应用程序启动时,将创建一个executor服务(在java.util.concurrent中使用Executors.NewFixedThreadPool(maxThreadNum))对象。当请求到来时,executor服务将创建线程来处理它们。 当应用程序启动时,它将在executorService池中创建200个线程。 只是想知道当应用程序启动时,这是一种正确的创建线程的方法吗?还是有更好

  • 有没有办法使用ExecutorService暂停/恢复特定线程? 想象一下,我想停止id=0的线程(假设为每个线程分配了一个增量id,直到达到线程池的大小)。 过了一会儿,按下一个按钮,比如说,我想恢复那个特定的线程,并让所有其他线程保持其当前状态,可以暂停或恢复。 我在Java文档中发现了PausableThreadPoolExecutor的一个未完成版本。但它不适合我的需要,因为它会恢复池中的

  • 我正在努力在我的项目中获得一个返回200个答案的邮政请求。我们有一个邮递员测试,运行良好,并生成以下代码: