我是Java的新手,如果这个问题变得无知,那么道歉。
假设我有一个实现Runnable的类A,该类的实例是在main中创建的,并且给出了自己的线程。让我们说这个班级拥有城镇对象的蓝图,这个城镇有居民。 Class Town能够创造新的居民。它还可以反复打印城镇的当前布局。
这个类有一个run方法,它重复执行一个任务(刷新城镇布局)。该类还有静态方法,我希望其他类使用它们(创建新的居民)。
我现在有B级,有居民的蓝图。因此,该类的许多实例在它们自己的线程中运行,并且想要使用类B的静态方法来重现(即创建新的居民)。
现在假设A类和B类对象的线程都在运行。如果B类(居民)的对象决定重现(使用B类静态方法之一),这会导致A类对象线程被中断吗?
即。当一个居民想要重现时,重现静态方法的行为会在居民的线程中吗?
我已经阅读过Java中的多线程,但在实际实现它时,我很难理解这个主题。任何有关多线程的建议都会非常有用。提前谢谢。
答案 0 :(得分:0)
现在假设A类和B类对象的线程都在运行。如果B类(居民)的对象决定重现(使用B类静态方法之一),这会导致A类对象线程被中断吗?
没有。方法所属的类或实例与运行它的线程之间没有任何联系。线程和方法之间唯一的关联是当您调用方法时,它在当前正在执行的线程上运行。如果A
' s run
在线程4452上运行并且您在线程4127上调用B.whatever()
,则它对线程4452没有任何影响,除非它们都尝试在线程4452上同步对象
答案 1 :(得分:0)
假设我有一个实现Runnable的类A,该类的实例是在main中创建的,并且给定了自己的线程。
给类一个线程的想法在Java中没有意义。您为Thread
对象提供Runnable
实例,当您start()
该线程时,它会执行给定实例的run()
方法。一旦线程运行,它在执行给定run()
方法的方式与程序的主线程如何执行程序的main(String[] args)
方法之间没有区别。
......当一个居民想要重现时,重现静态方法的行为是否会出现在居民的线索中?
线程中唯一的东西是线程调用的方法的局部变量。
一个对象永远不能 in 一个线程,因为一个对象永远不能 in 一个变量:对象总是在堆中,并且变量只保存对它们的引用。
所以,你所描述的基本上是两个不同的线程,每个线程执行不同的方法,并且它们都在相同的对象上运行而完全无视彼此。
这通常是一件坏事。
您需要确保线程同步他们在共享对象上执行的操作,以避免弄乱彼此的工作。一个很好的学习起点是通过Java Concurrencty Tutorial:http://docs.oracle.com/javase/tutorial/essential/concurrency/
当你准备深入探讨时,“实践中的Java并发”这本书是下一步的好结果:https://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/
答案 2 :(得分:-2)
通常方法和其他代码总是在调用者线程中执行,除非在另一个线程上下文中手动重定向。
由于你说的是静态方法,他们无论如何都无法访问类对象,如果你改变静态方法中的类行为可能不是一个好主意,也许你不应该使用那么多静态方法,除非是一些常量值和然后,在大多数情况下,线程间访问不成问题。但这取决于您的代码以及您在这些方法中所做的事情......
在Java中,如果您需要对来自多个线程的某些变量或类成员具有写访问权限或使用自定义volatile
块或方法,您还可以使用synchronized { ... }
修饰符。