线程的一个问题

aaaahuihui 2012-05-03 10:10:18
public static void main(String args[]) {
final Outputter outputter = new Outputter();

new Thread() {
public void run() {
outputter.output("zhangsan");

}
}.start();
为什么实例化Outputter时,需要定义为final,要不就报错。
...全文
162 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
aduwu_para 2012-05-04
  • 打赏
  • 举报
回复
inner class调用outer class的variable必须将其声明为final。
你要把他变成instance field也能调用。
aaaahuihui 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

Thread类里没有叫outputter的属性,调用不到它。
要么你就写一个Thread的子类,加上这个属性,创建对象的时候把outputter给它传进去。
[/Quote]那我直接改为 static {Outputter outputter = new Outputter()}不就行了?可还是报错
gukuitian 2012-05-03
  • 打赏
  • 举报
回复
应该是防止多线程并发访问这个对像时,由于某个线程对这个对像进行了修改,引起的错误
神经斌 2012-05-03
  • 打赏
  • 举报
回复
Thread类里没有叫outputter的属性,调用不到它。
要么你就写一个Thread的子类,加上这个属性,创建对象的时候把outputter给它传进去。
-迷糊- 2012-05-03
  • 打赏
  • 举报
回复
#6说的对,跟线程没太大关系。这是内部类的特性,为了保证outputter的声明周期为其内部类使用。
真实的蚂蚁 2012-05-03
  • 打赏
  • 举报
回复
看到8楼才看明白
aaaahuihui 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wugui414 的回复:]

Java code
new Thread() {
public void run() {
outputter.output("zhangsan");

}
}.start();

这是内部类,你的outputter是局部变量,它的生命周期只是这个方法中,但是这个内部类的生命周期就不是这个方法中了,所以你不可以直接使用,必须声明为final
[/Quote]说白了就是run()执行完后,局部变量outputter会清除,但outputter是在全局中定义的,所以是矛盾不合法的
aaaahuihui 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:

引用 1 楼 的回复:

Thread类里没有叫outputter的属性,调用不到它。
要么你就写一个Thread的子类,加上这个属性,创建对象的时候把outputter给它传进去。
那我直接改为 static {Outputter outputter = new Outputter()}不就行了?可还是报错

你这是方法里的静态块,不是创建静态变量……
[/Quote]准确来说 static是属于类的,而不是方法体
wugui414 2012-05-03
  • 打赏
  • 举报
回复
new Thread() {
public void run() {
outputter.output("zhangsan");

}
}.start();

这是内部类,你的outputter是局部变量,它的生命周期只是这个方法中,但是这个内部类的生命周期就不是这个方法中了,所以你不可以直接使用,必须声明为final
神经斌 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:

Thread类里没有叫outputter的属性,调用不到它。
要么你就写一个Thread的子类,加上这个属性,创建对象的时候把outputter给它传进去。
那我直接改为 static {Outputter outputter = new Outputter()}不就行了?可还是报错
[/Quote]
你这是方法里的静态块,不是创建静态变量。至少得这样:

public class Test {
public static void main(String args[]) {
new Thread() {
public void run() {
Outputter.outputter.output("zhangsan");

}
}.start();
}
}

class Outputter {
public static Outputter outputter = new Outputter();

public void output(String str) {
// TODO
}
}
aaaahuihui 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

Thread类里没有叫outputter的属性,调用不到它。
要么你就写一个Thread的子类,加上这个属性,创建对象的时候把outputter给它传进去。
[/Quote]
public class TraditionalThreadSynchronized {

static Outputter outputter = new Outputter();

public static void main(String args[]) {}}
这种写法是没问题的。但
public class TraditionalThreadSynchronized {

public static void main(String args[]) {
static Outputter outputter = new Outputter();
}
}是不容许的。
对象不能定义为局部静态?

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧