我有一个如下例子。它使用两个内部类,可以直接访问其封闭实例的方法和字段。有意义的是不使用内部类吗?以及如何修改它。
package java_example150;
public class TestThread3{
private int j;
public static void main(String[] args){
TestThread3 t = new TestThread3();
Inc inc = t.new Inc();
Dec dec = t.new Dec();
for(int i=0;i<2;i++){
Thread ts = new Thread(inc);
ts.start();
ts= new Thread(dec);
ts.start();
}
}
private synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
private synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
class Inc implements Runnable{
public void run(){
for(int i=0;i<10;i++){
inc();
}
}
}
class Dec implements Runnable{
public void run(){
for(int i=0;i<10;i++){
dec();
}
}
}
}
答案 0 :(得分:0)
在你的例子中,我认为没有必要重构它。你可以这样离开。当只有一个其他类需要内部类时才可以使用内部类,并且它们只能由该类访问/实例化。
如果你需要在另一个类中使用相同的功能,你可以重构它并将这些类移到单独的文件中。
答案 1 :(得分:0)
线程需要传入Runnable
类型作为线程的入口点。内部类是这样做的好方法。
使用匿名类来完成它可能是有意义的(特别是在这个简短的例子中)。你可以像这样重写你的循环:
for(int i=0;i<2;i++){
Thread ts = new Thread(new Runnable() {
public void run() {
for(int i = 0; i < 10; i++) inc();
}
);
ts.start();
ts= new Thread(new Runnable() {
public void run() {
for(int i = 0; i < 10; i++) dec();
}
);
ts.start();
}
答案 2 :(得分:0)
当您尝试使用非内部课程时发生了什么?你试图通过避免内部阶级来解决困难吗?
您可以转换为非内部类;你只需要将TestThread3的实例传递给每个对象。