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