我有一个扩展的Java类Thread,它基本上如下所示:
public class HttpRequestDispatcher extends Thread {
private String url;
private String method; // GET or POST
private byte[] postData;
public HttpRequestDispatcher(String url, String method, byte[] postData) {
this.url = url;
this.method = method;
this.postData = postData;
}
public HttpRequestDispatcher(String url, String method) {
this.url = url;
this.method = method;
}
public void run() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我需要run()方法来返回a ByteArrayOutputStream或a String.但是,因为它是在run()方法中Thread,我不能将方法的返回类型设置为a ByteArrayOutputStream或a String.
该HttpRequestDispatcher班被称为所谓的OAuth.java类里面.
我怎样才能解决这种情况?
据我所知,从java.lang.Thread文档和stackoverflow上发布的其他问题,如" 如何通过线程访问Runnable对象? "和" 获取Runnable的当前实例 ",不可能获得Runnable嵌入对象的引用在一个Thread.
具有这种可能性有用的场景是在实现一个方法时,由于我们覆盖了另一个类或接口中定义的方法,因此无法修改其签名,并且需要执行不同的操作,具体取决于Runnable嵌入的类型目前Thread.
如果我们有一个getRunnable在Thread类中调用的方法,我们可以这样做:
if (Thread.currentThread().getRunnable() instanceof Type1) {
// do something...
} else {
// do something else...
}
Run Code Online (Sandbox Code Playgroud)
这在我们想要确保方法中包含的操作仅由某些线程而不是其他线程执行的情况下也是有用的.
所以我想知道,Java开发人员决定不允许Runnable从a 获取实例的特定原因Thread,还是缺少值得通知的功能?如果您认为没有理由支持该选择,但将其作为缺失功能通知是不值得的,那么您将在上述场景中使用什么策略?
我正在使用这个标准构造函数:
new Thread(myRunnable);
Run Code Online (Sandbox Code Playgroud)
其中myRunnable是具有Runnable接口的自定义对象.
在线程进程中我需要访问该runnable对象(告诉进程状态和进度),我该怎么办?
如果我的对象是一个线程我将使用:
(MyThread) Thread.getCurrentThread()
Run Code Online (Sandbox Code Playgroud)
但由于runnable作为参数传递,我无法得到它.
编辑
这是我的代码结构:
public abstract class ProgressThread{
private float progress; //... progress getter, setter...
}
public class MyRunnable extends ProgressThread implements Runnable{
public void run(){
//starting processes...
Job1 j1=new Job1().do();
Job1 j2=new Job2().do();
}
private class Job1(){
for(int i=0;i<10;i++){
// do something
float progress=i/10;
// set job progress in thread
Thread.getCurrentThread().getRUNNABLE().setProgress(progress);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我需要getRUNNABLE()方法(或解决方法!)的原因.谢谢.