2017-02-13 60 views
-2

我对Java很陌生,所以如果这个问题无知,我很抱歉。具有自己的线程的类是否也有其他类使用的静态方法?

比方说,我有一个实现了Runnable的类A,该类的一个实例在main中创建并赋予它自己的线程。假设班级拥有城镇对象的蓝图,而且这个城镇有居民。班级镇能够创造新的居民。它也能够反复印刷当前的城镇布局。

这个类然后有一个反复执行任务的运行方法(刷新城市布局)。该类还有静态方法,我想被其他类使用(创建新的居民)。

我现在有B班,里面有一个居民的蓝图。因此,有很多这种类的实例在自己的线程中运行,并且想要使用类B的静态方法来再现(即创建新的居民)。

现在假设A类和B类对象都有自己的线程在运行。如果B类(居民)的对象决定再现(使用B类静态方法之一),这是否会导致A类对象线程中断?

I.e.当一个居民想要复制时,再现静态方法的行为是否会在居民线中?

我已阅读了Java中的多线程,但该主题对于实际实现它时很难理解。任何有关多线程的建议通常都会很有帮助。先谢谢你。

+3

唐*描述*代码,*显示*代码。 –

+0

在软件中,大多数东西都是*可能*。但请理解:使用** static **更多的是反模式。如果有的话,如果您的应用程序确实需要全局状态,那么您会考虑使用单例。但正如TJ所说:我们不谈论代码的描述,我们在这里讨论代码。我们不提供设计/实施指导,我们帮助**特定的**编程问题/问题。 – GhostCat

回答

0

现在假设A类和B类对象都有它们的线程在运行。如果B类(居民)的对象决定再现(使用B类静态方法之一),这是否会导致A类对象线程中断?

不。在类或方法的一部分和它所运行的线程之间没有连接。线程和方法之间的唯一关联是当你调用方法时,它在当前正在执行的线程上运行。如果Arun正在线程4452上运行,并且您在线程4127上调用B.whatever(),那么它对线程4452不起任何作用,除非它们都尝试在同一个对象上进行同步。

-2

通常方法和其他代码总是在调用者线程中执行,除非在另一个线程环境中手动重定向。

既然你讲的是静态方法,他们无论如何都不能访问类对象,如果你改变你的静态方法中的类行为可能不是一个好主意,也许你不应该使用这么多的静态方法,除非对于某些常量值然后在大多数情况下,线程间访问是没有问题的。但这取决于你的代码以及你在这些方法中做了什么......

在Java中,如果您需要对来自多个线程的某些变量或类成员具有写访问权限,或者使用自定义synchronized { ... }块或方法。

0

比方说,我有一个实现了Runnable的类A,该类的一个实例在main中创建并赋予它自己的线程。

在Java中给类创建一个线程的想法没有意义。你给一个Thread对象一个Runnable实例,当你的线程为start()时,它执行给定实例的run()方法。线程运行后,它如何执行给定的run()方法,以及程序的主线程如何执行程序的main(String[] args)方法没有区别。

......当一个居民想要复制时,再现静态方法的行为是否会在居民线中?

只有线程是线程调用的方法的局部变量。

的对象永远是一个线程,因为一个对象可以永远不会在变量:对象始终堆,和变量仅保持引用。

所以,你所描述的基本上是两个不同的线程,每个线程执行不同的方法,并且他们都在相同的对象上操作,完全不顾对方。

这通常是一件坏事。

您需要确保线程同步它们对共享对象执行的操作以避免弄乱彼此的工作。一个很好的起点,学习是通过Java Concurrencty教程,以自己的方式工作:http://docs.oracle.com/javase/tutorial/essential/concurrency/

当你准备深究下去,这本书的“Java并发编程实践”是一个很好的下一步:https://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/

相关问题