所以我的程序包含两个类 1.我的主类处理GUI扩展了JFrame,所以我需要实例化它来配置我的JFrame。 2. MyClass使用API来请求和处理从服务器请求的数据,该API必须具有另外处理请求的API类的实例。 (它是一个可运行的类,并实现了API的包装器)
因此,如果我只是在我的主类中实例化MyClass(Runnable Processor = new MyClass())并使用它创建一个线程并运行。我无法访问MyClass或API类方法的方法(我特别感兴趣的是连接杀手方法)。我试图像Processor.API.eDisconnect()那样访问它。那不起作用。
但如果这样做:创建MyClass的Arraylist然后将MyClass的实例添加到列表中。创建一个类似Thread myThread = new Thread(List.get(0))的线程。我可以访问我的API类方法,如List.get(0).API.eDisconnect()。
那为什么第二种方法有效呢?唯一的区别是类实例是一个自变量或在列表中。
适当的做法是什么问题可以发生?有更好的方法吗?
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package basket;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
*
* @author ivan
*/
public class Basket extends JFrame implements ActionListener{
protected List<TwsHandler> TWS = new ArrayList<>();
public static void main(String[] args)
{
Basket main = new Basket();
main.Launch();
}
public void Launch()
{
TWS.add(new TwsHandler());
BorderLayout MainLayout = new BorderLayout();
JButton Start = new JButton("Start");
Start.addActionListener(this);
Start.setActionCommand("Start");
JButton Stop = new JButton("Stop");
Stop.addActionListener(this);
Stop.setActionCommand("Stop");
this.setLayout(MainLayout);
this.add(Start , BorderLayout.SOUTH);
this.add(Stop , BorderLayout.WEST);
this.addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e){System.exit(0);}
});
this.setTitle("Option basket robot");
this.setBounds(100, 100, 800, 600);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e)
{
switch (e.getActionCommand()) {
case "Start":
Thread Processor = new Thread(TWS.get(0));
Processor.start();
break;
case "Stop":
System.out.println(TWS.get(0).Eclient.isConnected());
break;
}
}
}
答案 0 :(得分:1)
唯一的区别是,在第一种情况下,您将MyClass
实例引用为Runnable
,而在第二种情况下,您将其引用为MyClass
(通过ArrayList
,不起任何作用)。
而不是
Runnable processor = new MyClass();
使用
MyClass processor = new MyClass();
因为您希望能够调用MyClass
方法。