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

标签 java multithreading futuretask

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

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

对于 2,我 understand that拥有 future 的对象将是更好的方法。那么为了实现以上两个需求,下面是我想出的一段代码

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

最佳答案

Using executorService is not an option since I have threads which are not doing similar tasks.

我不明白这有什么关系。

Also executorService accepts a thread name prefix instead of a thread name. I want to give each thread a unique name.

因此,为每个线程指定一个带有 ThreadFactory 的名称。我有一个类,我称之为 NamedThreadFactory。

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

你可以这样做

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]

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

关于java - 多线程 - 命名线程和处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16932802/

相关文章:

java - 想法和命令行java产生具有相同时区的不同日期

java - 使用oracle jdbc连接时如何获取数据库模式名称?

c# - 如何创建一个一次只能从一个线程执行的异步方法?

Java:记录 FutureTask 异常

java - 如何提高 oracle 中简单选择查询的性能

java - com.thoughtworks.xstream.mapper.CannotResolveClassException

不锁定生产者或消费者的 C# 线程

c# - 此代码段中的竞争条件在哪里? (简而言之,来自 C# 5.0)

java - 重新启动 ScheduledThreadPoolExecutor 中取消的任务