有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将单个可运行对象传递给多线程构造函数

如果我创建一个可运行的对象

Runnable run = new MyRunnable();

然后将相同的对象传递给两个线程构造函数并运行它们

new Thread(run).start;
new Thread(run).start;
  1. 有可能吗?这意味着什么
  2. 如果我调用线程。睡眠(0);在MyRunnable类中,两个线程都会因为是同一个对象而休眠,还是线程实体与对象完全分离
  3. 有没有理由这样做,如果没有,请仍然回答上面的两个问题,因为我认为我还没有完全理解线程机制

共 (2) 个答案

  1. # 1 楼答案

    1. 这绝对是可能的,也是合法的。如果你的Runnable没有状态(没有字段),那么一切都会很好。如果您的Runnable确实具有可变状态,那么您可能需要使用Java的许多互斥机制之一,如ReentrantLocksynchronized关键字。因为两个线程将对同一Runnable对象的字段进行变异

    2. 不,您创建并运行了两个不同的线程。它们只是调用Runnable.run()

    3. 这不是不可能的。我甚至不会说这一定是坏习惯。在特定情况下,您可能会将此作为练习留给读者

  2. # 2 楼答案

    1) Is the possible? What are the implications?

    是的,这是可能的

    这意味着Runnable中的任何状态都(可能)由所有线程共享,需要正确同步对该状态的访问/更新

    2) If I call Thread.sleep(0); in class MyRunnable, will both threads sleep because they are the same object, or is the thread entity completely separate from the object?

    不,他们不会

    线程在逻辑上与Runnable不同。调用Thread.sleep()不会直接影响Runnable和其他共享它的线程。(它可能会间接影响其他线程;例如,如果一个线程在持有Runnable的基本锁时休眠,而其他线程需要获取锁才能取得进展。)

    3) Would there ever be a reason to do this, if not please still answer the two questions above, because I don't think I fully understand the thread mechanism yet?

    如果没有与Runnable关联的线程特定状态,并且希望最小化空间开销,或者初始化Runnable的开销,则可以执行此操作。但是这样的用例在实践中很少出现

    在绝大多数实际用例中,每个线程都需要一个不同的Runnable实例