java将单个可运行对象传递给多线程构造函数
如果我创建一个可运行的对象
Runnable run = new MyRunnable();
然后将相同的对象传递给两个线程构造函数并运行它们
new Thread(run).start;
new Thread(run).start;
- 有可能吗?这意味着什么李>
- 如果我调用线程。睡眠(0);在MyRunnable类中,两个线程都会因为是同一个对象而休眠,还是线程实体与对象完全分离李>
- 有没有理由这样做,如果没有,请仍然回答上面的两个问题,因为我认为我还没有完全理解线程机制李>
# 1 楼答案
这绝对是可能的,也是合法的。如果你的
Runnable
没有状态(没有字段),那么一切都会很好。如果您的Runnable
确实具有可变状态,那么您可能需要使用Java的许多互斥机制之一,如ReentrantLock
或synchronized
关键字。因为两个线程将对同一Runnable
对象的字段进行变异不,您创建并运行了两个不同的线程。它们只是调用
Runnable.run()
这不是不可能的。我甚至不会说这一定是坏习惯。在特定情况下,您可能会将此作为练习留给读者
# 2 楼答案
是的,这是可能的
这意味着Runnable中的任何状态都(可能)由所有线程共享,需要正确同步对该状态的访问/更新
不,他们不会
线程在逻辑上与
Runnable
不同。调用Thread.sleep()
不会直接影响Runnable
和其他共享它的线程。(它可能会间接影响其他线程;例如,如果一个线程在持有Runnable的基本锁时休眠,而其他线程需要获取锁才能取得进展。)如果没有与
Runnable
关联的线程特定状态,并且希望最小化空间开销,或者初始化Runnable
的开销,则可以执行此操作。但是这样的用例在实践中很少出现在绝大多数实际用例中,每个线程都需要一个不同的
Runnable
实例