相关疑难解决方法(0)

如何将参数传递给匿名类?

是否可以传递参数或访问外部参数到匿名类?例如:

int myVariable = 1;

myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // How would one access myVariable here?
    }
});
Run Code Online (Sandbox Code Playgroud)

有没有办法让侦听器访问myVariable或传递myVariable而不将侦听器创建为实际的命名类?

java anonymous-class

143
推荐指数
7
解决办法
9万
查看次数

如何从匿名内部类调用特定的父构造函数?

好的,所以我知道匿名内部类要么隐式扩展父类,要么实现接口,因此需要调用超类的构造函数.但是,我不确定如何为匿名类创建构造函数(如果这是可能的)并且没有定义构造函数我不知道如何调用super()!这是我的练习代码:

public class AnonymousConstructor {
    public static void main(String[] args) {
        //I'm not sure how to explicitly call one of the arg super constructors
        MyBob my = new MyBob() {
            //I would like to do something like this super("String"); or      
            //super("String", "String");
        };

    }
}

class MyBob extends Thread {
    MyBob() {
        System.out.println("No arg constructor");
    }
    MyBob(String a) {
        System.out.println("Arg constructor");
    }
    MyBob(String a, String b) {
        System.out.println("2 arg constructor");
    }
    public void run() {
        System.out.println("Outer");
    }
}
Run Code Online (Sandbox Code Playgroud)

我担心的是,如果你试图从一个没有no-arg构造函数的类创建一个匿名类,那么代码将在编译时失败,因为没有办法将参数传递给superconstructor.这是一个有效的问题,如果是这样,有没有办法解决这个问题?

java constructor scjp inner-classes

26
推荐指数
2
解决办法
4756
查看次数

在 Java Future 的完成中释放资源 - 此处:对 Callable 及其外部变量的引用

在我的项目中,我经常使用 Java Futures 处理并发任务。在一个应用程序中,每个并发任务在完成期间都需要相当大的内存块。由于一些其他设计选择,该内存是在线程外部创建的对象中创建和引用的(参见下面更详细的示例)。

令我惊讶的是,即使在未来任务(即它的计算线程)已经完成之后,future 仍然持有对这个对象的引用。也就是说:如果在别处没有对该对象的其他引用,则该对象将不会被释放,除非未来被释放 - 即使任务已完成。

我天真的想法是,限制并发线程的数量会自动限制任务持有的资源(内存)数量。这不是真的!

考虑下面的代码。在这个例子中,我创建了一些任务。在计算过程中,ArrayList(它是一个外部变量)的大小会增加。该方法返回一个Vector<Future>. 即使任务已经完成,即使 ArrayList 的范围已经离开,Future 仍然持有对 ArrayList 的引用(通过FutureTask.sync.callable)。

总结一下:

  • FutureTask 持有对 Callable 的引用,即使 Callable 已完成。
  • Callable 保存对计算期间使用的最终外部变量的引用,即使计算已完成。

问题:释放通过 Future 持有的资源的最佳方式是什么?(当然,我知道可调用的局部变量在线程完成时被释放——这不是我所要求的)。

/*
 * (c) Copyright Christian P. Fries, Germany. All rights reserved. Contact: email@christianfries.com.
 *
 * Created on 17.08.2013
 */

package net.finmath.experiments.concurrency;

import java.util.ArrayList;
import java.util.Vector;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * @author Christian Fries
 *
 */
public class ConcurrencyTest { …
Run Code Online (Sandbox Code Playgroud)

java concurrency memory-management

6
推荐指数
1
解决办法
5033
查看次数