Java:对线程内非最终局部变量的引用
我正在创建一些Java代码,如下所示:Java:对线程内非最终局部变量的引用,java,multithreading,local-variables,Java,Multithreading,Local Variables,我正在创建一些Java代码,如下所示: new Thread() { @Override public void run() { for(;;) { DataPkg data_pkg = new DataPkg(datapkg_passport, new Data); try{ int len = channel.read(data_pkg); //block read from the ch
new Thread() {
@Override public void run() {
for(;;) {
DataPkg data_pkg = new DataPkg(datapkg_passport, new Data);
try{
int len = channel.read(data_pkg); //block read from the channel
if (len > 0) writeWs(data_pkg);
if (len == -1) {
channel.close();
writeWs(new SigPkg(sigpkg_passport, "201")); //channel termination notification
break;
}
} catch(Exception e) {e.printStackTrace();}
}
Thread.interrupted();
}
}.start();
…但编译器给了我一个错误:“从内部类引用的局部变量必须是final或实际上是final”。我知道类似的问题在网络上甚至在这里一再出现,但我只是没有找到一个好的答案
我认为这是因为VM需要确保线程不应该使用由可能最近终止的方法动态创建的任何变量,并且对内存位置的引用变得无效并导致问题
但在我的例子中,我真的需要在新创建的通道上有一个专用线程,以保持从通道的对等端馈送数据并反馈到服务器端,而且该通道最好是动态创建的,因为它不是一个简单的套接字
对于这种情况,有什么解决方案或解决办法吗?也许您在某个地方修改了
频道
?这将导致此错误。只需确保每个线程都获得一个新的通道
变量。一种方法是在代码周围加上一对大括号,并在其中声明变量。同时将频道设置为final,这样编译器会告诉您是否尝试在某个地方对其进行修改
{
final Channel channel = ...
new Thread() {
...
}.start();
}
使用构造函数使线程类非匿名(即声明静态类),并在实例化时传入通道
class MyThread extends Thread {
private Channel channel;
public MyThread(Channel channel) { this.channel = channel; }
@Override public void run() { ... }
}
MyThread t = new MyThread(channel);
t.start();
请发布一个,这样我们就可以确切地看到问题所在。由于线程位于新创建的通道上,并且出于此目的,只有一个活动通道,那么通道最终的问题是什么?听起来您几乎应该在这里实现生产者-消费者模式……您没有修改所发布代码中的任何变量。该错误发生在哪一行?@Untitled123,您好,我实际上可以在线程内创建通道,但对于构造,它需要一些其他动态生成的变量(因为它不仅仅是一个套接字),并且问题会反弹回来。。。(生成data_pkg和sig_pkg的过程也一样……谢谢Jim,我认为这会很好,尽管我仍在尝试实现整个过程,因为逻辑变得有点复杂。太好了!请“接受”这个较新的,这样其他人就会知道它是正确的。嗨,Jim,我没有找到“接受”的答案此页上的按钮或链接可能会给您一些建议,谢谢。@GuZhang它就像答案右侧的复选标记。您可以单击它,它将变为绿色,表示此答案解决了您的问题。