多线程 - 命名线程和处理异常

时间:2013-06-05 06:16:03

标签: java multithreading futuretask

在java中,有哪些建议的方法来实现两个线程要求

  1. 我想这个名字是一个线程
  2. 我希望父(或主)线程知道此子线程是否有任何异常。
  3. 对于2,具有未来对象的I understand that将是更好的方法。因此,为了实现以下两个要求,我提出了一个代码

    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接受线程名称前缀而不是线程名称。我想给每个帖子一个唯一的名字。

2 个答案:

答案 0 :(得分: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]

BTW没有必要启动一个线程并立即等待它完成。你也可以使用当前的线程。

答案 1 :(得分: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++);
  }

}

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

--- --- EDIT

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

一种可能性是在Runnable中设置名称:参见Peter的答案,只需添加一个:您可以在启动Thread之前初始化Runnable实现的成员变量而不是固定的String。