我是靠谱客的博主 热情香水,最近开发中收集的这篇文章主要介绍java 获取调用者方法_Java如何从单独的线程获取调用者?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

嗯……不确定这是否可行,但如果你在一个单独的线程上运行,怎么会在Java中抓取真正的调用者的类名(理想情况下也是方法名)?我想将类名称卸载到一个单独的线程(以便在我每秒执行100次日志记录操作时不阻止UI线程).

例如:

class Main {

public void callerMethod() {

Thread.currentThread().getStackTrace()[2].getMethodName(); // This gets me the caller. However, this is expensive to do on the UI Thread 100+ times per second. a call here can take up 70ms

new Thread(new Runnable() {

@Override

public void run() {

new SecondObject().iWantToKnowMyCaller();

}

}).start();

}

}

class SecondObject {

public void iWantToKnowMyCaller() {

// how do i get the caller method here so that it's "callerMethod" from "Main" ?

}

}

用例是这样的:我正在记录大量数据,我根本不想阻止主线程.一些日志记录可能是快速和小数据,但有些可能会记录转储很多东西.问题还在于,现在,编写代码的方式,大约有600个入口点进入callerMethod(),因此重构将是一个相当大的挑战.

或者:

如果你能证明Thread.currentThread().getStackTrace()[2] .getMethodName();保证是每次少于5毫秒的恒定时间操作,那么在主线程上可以接受.

解决方法:

编辑:

好的,您想要避免堆栈跟踪.我环顾了一下:确定调用者的复杂性实际上是在LogRecord中.如果您可以通过Logger.setSourceClassName()手动设置调用者(根本不需要任何字符串),那么LogRecord将不再构建堆栈跟踪来查找调用者的名称.

public class ThreadTest

{

public static void main( String[] args )

{

LogRecord lr = new LogRecord( Level.INFO, "Hi" );

lr.setSourceClassName( "ThreadTest.main" ); // anything, including null

Logger.getAnonymousLogger().log( lr );

}

}

原始答案:

子类化线程将起作用,但我有点质疑你为什么要这样做.对于调试可能,但这是我能想到的唯一用例. (P.S.我必须在堆栈跟踪中更改您的偏移量.“2”将获得callerMethod的调用者 – 在下面的示例中为“main”.)

public class ThreadTest

{

public static void main( String[] args )

{

new Main().callerMethod();

}

}

class Main {

public void callerMethod() {

final String callee = Thread.currentThread().getStackTrace()[1].getMethodName(); // This gets me the caller

new MyThread(new Runnable() {

@Override

public void run() {

new SecondObject().iWantToKnowMyCaller();

}

}){

@Override

public String getInvoker() { return callee; }}.start();

}

}

abstract class MyThread extends Thread implements Invoker {

public MyThread( Runnable r )

{

super( r );

}

}

class SecondObject {

public void iWantToKnowMyCaller() {

// how do i get the caller method here so that it's "callerMethod" from "Main" ?

System.out.println( ((MyThread)(Thread.currentThread())).getInvoker() );

}

}

interface Invoker {

String getInvoker();

}

标签:java,multithreading

来源: https://codeday.me/bug/20190624/1277390.html

最后

以上就是热情香水为你收集整理的java 获取调用者方法_Java如何从单独的线程获取调用者?的全部内容,希望文章能够帮你解决java 获取调用者方法_Java如何从单独的线程获取调用者?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部