java - 通过为单个线程分配唯一的 ID 来提高输出的清晰度

标签 java multithreading oracle concurrency locking

我是 Java 新手,正在尝试学习高级并发的概念。我在Java教程Oracle中看到了下面的代码。

但是,当我运行代码时,输​​出并没有表明它来自哪个线程。所以我的问题是,如何输出线程 ID(即以某种方式为单个线程分配唯一的 ID),以便我可以实际识别哪个线程正在做什么。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.Random;

public class Safelock {
    static class Friend {
        private final String name;
        private final Lock lock = new ReentrantLock();

        public Friend(String name) {
            this.name = name;
        }

        public String getName() {
            return this.name;
        }

        public boolean impendingBow(Friend bower) {
            Boolean myLock = false;
            Boolean yourLock = false;
            try {
                myLock = lock.tryLock();
                yourLock = bower.lock.tryLock();
            } finally {
                if (! (myLock && yourLock)) {
                    if (myLock) {
                        lock.unlock();
                    }
                    if (yourLock) {
                        bower.lock.unlock();
                    }
                }
            }
            return myLock && yourLock;
        }

        public void bow(Friend bower) {
            if (impendingBow(bower)) {
                try {
                    System.out.format("%s: %s has"
                        + " bowed to me!%n", 
                        this.name, bower.getName());
                    bower.bowBack(this);
                } finally {
                    lock.unlock();
                    bower.lock.unlock();
                }
            } else {
                System.out.format("%s: %s started"
                    + " to bow to me, but saw that"
                    + " I was already bowing to"
                    + " him.%n",
                    this.name, bower.getName());
            }
        }

        public void bowBack(Friend bower) {
            System.out.format("%s: %s has" +
                " bowed back to me!%n",
                this.name, bower.getName());
        }
    }

    static class BowLoop implements Runnable {
        private Friend bower;
        private Friend bowee;

        public BowLoop(Friend bower, Friend bowee) {
            this.bower = bower;
            this.bowee = bowee;
        }

        public void run() {
            Random random = new Random();
            for (;;) {
                try {
                    Thread.sleep(random.nextInt(10));
                } catch (InterruptedException e) {}
                bowee.bow(bower);
            }
        }
    }


    public static void main(String[] args) {
        final Friend alphonse =
            new Friend("Alphonse");
        final Friend gaston =
            new Friend("Gaston");
        new Thread(new BowLoop(alphonse, gaston)).start();
        new Thread(new BowLoop(gaston, alphonse)).start();
    }
}

最佳答案

您可以使用“Thread.currentThread().getName()”打印当前线程的名称。所以你的系统输出将更改为:

System.out.format(Thread.currentThread().getName() + "%s: %s has" +
            " bowed back to me!%n",
            this.name, bower.getName());

如果你想给线程赋予你自己的特殊名称,那么你可以在创建时命名它们:

new Thread(new BowLoop(alphonse, gaston), "MyThread1").start();
new Thread(new BowLoop(gaston, alphonse), "Mythread2").start();**

关于java - 通过为单个线程分配唯一的 ID 来提高输出的清晰度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518970/

相关文章:

REGEXP_SUBSTR : Need more precise regex code

java - 使用 Hibernate 和多线程批量更新 DB2

ios - 如何判断当前线程是否创建为 NSThread?

SQL - CASE WHEN 计算不同的值

c# - Thread.Join 在多个线程上超时

java - 递增线程名称

sql - 使用 SQL 逐字反转字符串

java - 这是最常见的情况吗?

java - 如何修复 java.lang.ClassNotFoundException : kotlin. 字符串

java - 如何在 php 中为 windows 创建 localhost 域管理?