0

在java中,实现两个线程要求的建议方法是什么

  1. 我想要一个线程的名字
  2. 我希望父(或主)线程知道这个子线程是否有任何异常。

对于 2,我知道拥有一个未来的对象会是一个更好的方法。所以要实现上面的两个要求,下面是我想出的一个代码

class MyRunnable implements Runnable {
  ....
}


MyRunnable myRunnable = new MyRunnable ();
FutureTask futureTask = new FutureTask(myRunnable, null);
Thread myThread = new MyThread(futureTask, "processing-thread");
myThread.start();
try {
   futureTask.get();
} catch (Exception e) {
   throw new RuntimeException(e)
}

这似乎是很多简单东西的代码。还有更好的方法吗?

注意 - 使用 executorService 不是一个选项,因为我有没有执行类似任务的线程。executorService 也接受线程名称前缀而不是线程名称。我想给每个线程一个唯一的名称。

4

2 回答 2

2

使用 executorService 不是一个选项,因为我有没有执行类似任务的线程。

我不明白这有什么关系。

executorService 也接受线程名称前缀而不是线程名称。我想给每个线程一个唯一的名称。

所以给每个线程一个名称,并带有一个 ThreadFactory。我有一个名为 NamedThreadFactory 的类。

我怀疑您希望线程执行的操作是反映任务正在执行的操作。

你可以这样做

ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(new Runnable() {
    public void run() {
        Thread.currentThread().setName("Working on task A");
        try {
            System.out.println("Running: "+Thread.currentThread());
        } finally {
            Thread.currentThread().setName("parked worker thread");
        }
    }
});
es.shutdown();

印刷

Running: Thread[Working on task A,5,main]

顺便说一句,启动一个线程并立即等待它完成是没有意义的。您也可以使用当前线程。

于 2013-06-05T06:30:35.837 回答
0

对于命名:

ThreadFactory myFactory = new ThreadFactory(){
  @Override public Thread newThread( Runnable r ) {
       return new Thread( r, getName() )
  }

  private int number = 0;

  private String getName(){
      return "MyThread_" + (number++);
  }

}

还有其他方法。这是我个人最喜欢的。

- -编辑 - -

为了给线程完全不同的名称,我会采取另一种方式:

一种可能性是在 Runnable 中设置名称:请参阅 Peter 的回答并添加一个内容:您可以在启动 Thread 之前初始化 Runnable 实现的成员变量,而不是固定的字符串。

于 2013-06-05T06:28:51.680 回答