请相信我,因为我仍然掌握Java。
下面的示例从名为Parent
的类中读取,该类在main
方法上创建自身的实例。然后它使该实例进行各种计算。
接下来,它会激活一个名为Child
的线程,将Parent
实例作为对Child
的引用。
Child
只是坐在那里监控事情,有时会在Parent
上启动公共方法。
有效。问题是,是这种糟糕的风格?是否有更多的 Java思维方式做这种工作?
public class Parent {
// main function that fires up the program
public static void main() {
// creates an instance of himself
// and fires go that does all sorts of fuzzy calculus
Parent parent = new Parent();
parent.go();
// creates a new thread of child and starts it
Child child = new Child(parent);
child.start();
}
private void go() {
// all sort of initializations
}
public void getDataFromChild(int data) {
// will get data from running child thread
}
}
public class Child extends Thread {
private Parent parent;
// child constructor grabs Parent instance into "o"
public Child(Parent o) {
parent = o;
}
// this class main loop
public void run() {
while(1==1) {
doSomething();
try {
sleep(1000);
}
catch(Exception e) { }
}
}
private void doSomething() {
parent.getDataFromChild(1);
}
}
谢谢。
答案 0 :(得分:5)
子类化线程被认为是坏的风格。最好实现Runnable,然后将runnable交给一个线程(嗯......非常类似于你的父/子切换!)。
Runnable r = new Child(parent);
new Thread(r).start();
否则你的Child.java代码对我来说很好。
要实现Runnable,您只需要提供run()方法:
public class Child implements Runnable {
private Parent parent;
public Child(Parent parent) { this.parent = parent; }
public void run() {
// what the thread does goes in here...
}
答案 1 :(得分:2)
问题是,这种风格很差吗?是否有更多的Java思维方式来做这种工作?
传递“子”对象对其“父”的引用既不是好风格也不是坏风格。这只是编程。
在一个真实的应用程序(而不是你的高度人为的例子)中,你可以判断这是否是好的设计。
答案 2 :(得分:1)
除了Julius Davies'回答之外,我对此类代码还有另一个担忧:
Child child = new Child(parent);
即为什么是自己线程中的孩子,而孩子将与父母一起做什么?
如果父母真的像看起来那样微不足道,那么子线程似乎没有必要。另一方面,如果父项在启动子线程后执行更多工作,则您需要处理同步问题。你必须处理它们。墨菲定律说,可以发生的任何线程问题,将发生。 (支持:即使你是墨菲定律专家,也有比你所知更多可能的线程问题。)
编辑:好的,子线程调用parent.getDataFromChild
。该方法对数据有何影响? (它是否也对从主线程访问的对象进行了任何更改?)由于它是从子线程调用的,因此需要检查父类和子类是否存在可能的竞争条件。
答案 3 :(得分:1)
除了Child
类应该实现Runnable
之外,我没有看到任何错误。只要您记录Parent
和Child
之间的关系,它就会很好。
答案 4 :(得分:0)
如果在其他地方引用了Child,您将要覆盖父级的finalize方法以清理Child。否则,我似乎完全可以接受。
答案 5 :(得分:0)
关于你写的内容,Child最好是在Thread中运行的Runnable
http://www.javabeginner.com/learn-java/java-threads-tutorial
然后关于这个答案是否是一个好方法的问题:这取决于你想做什么LOL
您可以查看以下几点:
InterruptedException的
读取同步以防止同时访问/修改。
而不是睡眠,您可以检查观察者类/设计模式,以控制线程何时唤醒以进行测试
最后,我想向您介绍使用Java浏览应用程序的精彩世界:D
编辑:正如Dave L指出的那样,你需要注意清理你所引用的内容,否则你最终会在你的程序中找到僵尸^^
答案 6 :(得分:0)
我从你的代码中读到的是循环依赖,这很糟糕。
您可以使用接口来删除依赖项。