在线程

时间:2016-02-15 16:44:12

标签: multithreading java-8

有没有办法在自己的线程中运行函数/方法?

我现在有两个用例。一个是我传入了Consumer<T>。我想在自己的线程上运行它,因为它需要很长时间才能完成。

我的另一个用例是我在同一个类中有许多函数,我想单独在它们自己的线程中运行(每个函数一个线程)。这些功能需要访问其班级状态的私人数据。

有没有办法在java中执行此操作?

更新:为了它的价值,我知道&#34;正常&#34;这样做的方法,通过扩展Thread或实现runnable。但是,在这两种情况下,这些方法都不起作用。

更新2: 实施Runnable不会起作用,因为班级有许多不同的方法,都必须独立运行&#34;在他们自己的线程上。鉴于此类中有很多方法需要运行线程,这不会起作用。由于这些线程需要访问某些共享私有数据,我甚至无法将每个方法拆分为自己的类(即使这不会映射到我认为的逻辑类)。

如果我有Consumer<T>,我无法扩展/实施Thread/Runnable,因为我无法控制界面。该方法将Consumer<T>作为参数,我需要在其自己的线程中调用它。我想在这里我可以创建一个包装类,但是我必须为ConsumerFunction等创建(我认为)一个包装类。所有这些似乎都是不必要的(至少来自其他语言)。

更新3:假设同步不是问题(数据是不可变的,或者争用非常低) 我正在寻找更好的方法。这更清楚吗?

1 个答案:

答案 0 :(得分:2)

作为函数/方法的部分解决方案(如果它们不需要参数),您可以使用ThreadExecutorService和方法引用。

如果您需要参数,则必须编写lambda表达式 - 请参阅方法t3,这是一个例子。

public class Test {

  public void t1() {
    System.out.println("t1");
  }

  public void t2() {
    System.out.println("t2");
  }

  public void t3(int n) {
    System.out.println("t3:"+n);
  }

  public static void main(String[] args) throws InterruptedException {
    Test test = new Test();
    Thread t = new Thread(test::t1);
    t.start();
    ExecutorService es = Executors.newFixedThreadPool(5);
    es.submit(test::t2);
    es.submit(() -> test.t3(99));
    es.shutdown();
    es.awaitTermination(1, TimeUnit.SECONDS);

  }
}