在Java类中使用线程而不实现Runnable,也不扩展Thread
我正在写一个可以接收和发送datagramPacket的类SipProvider。 这个类是我正在开发的SIP堆栈的一部分。
我提供的API不会使SipProvider实现Runnable或扩展线程。
我试图实现的解决方案是在SipProvider内部创建一个新类,它将扩展线程。 我想给线程的参数,我有一个编译问题(没有可以访问类型SipProvider的封闭实例),线程无法实例化,因为它与SipProvider有关(我发现它应该是静态的,但不知道怎么做)。
我已经查找了如何在课堂上实现线程,但没有找到解决方案。 有没有一种已知的方式来做到这一点。
这是我一直在努力做的一个快照。 这只是班上的一部分。
public class SipProvider {
//startOn is the method which allow the user to listen on a port
//so the user don't have to bother creating a thread and so on
public static SipProvider startOn(listeningPoint) {
SipProvider sipProvider = new SipProvider();
thread.sipProvider = sipProvider;
thread.run();
return sipProvider;
}
//this is the thread i want to handle the listening process
public class ReceiveThread extends Thread{
public SipProvider sipProvider;
public ReceiveThread(SipProvider sipProvider){
this.sipProvider = sipProvider;
}
@Override
public void run(){
try {
int MAX_LEN = 200;
DatagramSocket datagramSocket = new DatagramSocket(
listeningPoint.getPort());
sipProvider.datagramSocket = datagramSocket;
byte[] buffer = new byte[MAX_LEN];
DatagramPacket packet = new DatagramPacket(buffer, MAX_LEN);
while (!datagramSocket.isClosed()) {
sipProvider.setSipListener(sipListener);
datagramSocket.receive(packet);
//handle packet content
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
EDITH:
我发现的另一个解决方案除了提出的方案(其完美工作)之外,还实例化了一个新线程并同时定义了它的run()方法。 在我的示例中,startOn方法开始侦听listenPoint(其中包含有关使用的端口地址和协议的信息)。
public static SipProvider startOn(final ListeningPoint listeningPoint) throws SocketException {
final SipProvider sipProvider = new SipProvider(listeningPoint);
new Thread() {
@Override
public void run() {
try {
while (true) {
DatagramPacket packet = newDatagramPacket(new byte[200], 200);
sipProvider.datagramSocket.receive(packet);
String content = new String(packet.getData(), 0, packet.getLength());
sipProvider.sipListener.processContent(content);
}
} catch (Exception e) {
}
}
}.start();
return sipProvider;
}
这段代码可以帮助你:
public class SipJob implements Runnable {
private SipProvider sipProvider;
public SipJob(SipProvider sipProvider) {
// pass other parameters, if you need
this.sipProvider=sipProvider;
}
@Override
public void run() {
// do the code, use SipProvider
}
}
这将包含您想要运行的代码。 您可以根据需要将任意数量的参数添加到构造函数中,您可以从业务逻辑中使用它们。 我建议不要传递资源(例如套接字),因为它们必须关闭,分隔开放代码和结束代码是不明智的(同一实体必须对这两者负责)。
现在你需要一个Thread
来执行:
SipProvider sipProvider = ...;
Runnable job = new SipJob(sipProvider);
Thread runner = new Thread(job);
runner.setDaemon(true);
runner.start();
注意 - 据我了解 - 这将在后台运行,所以我设置了setDaemon(true)
。
我不确定,但是你可能在SipProvider
有内部的东西,你想在线程中使用。 这样我建议首先扩展SipProvider
类,以便访问这些内部变量/方法,使用SipJob
类中的SipJob
类。
编辑:访问SipProvider的内部的另一种方法是扩展类,并将SipJob类定义为后代中的inner class
(不是内部静态类,而是实例类)。 这样,您将自动访问包含SipProvider的实例变量 - 您甚至不必将其作为参数传递。 试试从内部实例类: SipProvider.this.whateverField
。
上一篇: Use of thread in Java class without implementing Runnable nor extending Thread
下一篇: Lock for JavaME