我们可以将线程连接方法放在同步方法中吗

can we put thread join method inside synchronized method

我可以在同步方法中使用 thread.join 吗?

class Table{  
 synchronized void printTable(int n){//synchronized method  
   for(int i=1;i<=5;i++){  
     System.out.println(n*i);  
     try{  
      Thread.join(); 
     }catch(Exception e){System.out.println(e);}  
   }  
 }  
}  

我可以使用 thread.join 而不是等待吗?

首先:它不是一个静态方法,所以 Thread.join 不会工作。
是的,你可以调用。 没有编译或运行时异常,但请考虑以下两点,你可能不想在那之后做它。 :)
加入一个线程意味着一个线程等待另一个结束,这样您就可以安全地访问它的结果或在两者都完成后继续 jobs.All join() 的重载版本是最终的和同步的。
同步方法启用了一种简单的策略来防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都通过同步方法完成。

很不清楚你想在这里做什么。看来您可能误解了 synchronized 关键字的作用以及示例中使用的锁的位置。

Thread.join(); 无效,因为它是一个实例方法。您实际上想要加入哪个线程并不明显。您需要提供对您要等待其终止的任何线程的引用。

这是Java tutorial description of Thread#join

The join method allows one thread to wait for the completion of another. If t is a Thread object whose thread is currently executing,

t.join();

causes the current thread to pause execution until t's thread terminates. Overloads of join allow the programmer to specify a waiting period. However, as with sleep, join is dependent on the OS for timing, so you should not assume that join will wait exactly as long as you specify.

不清楚为什么要在 for 循环中执行此连接,因为连接方法会一直等到线程完全完成(不再处于活动状态),多次调用它似乎没有用。 (是否有多个线程需要当前线程加入?或者您希望提供超时值并反复尝试加入同一个线程?)

在您的评论中,当您提问时:

simple question about can I use thread.join instead of wait

您不能将其中一个用作另一个的替代品。 synchronized 方法持有的锁与 join 使用(获取、释放、然后重新获取)的锁不同。 join 方法使用线程上的锁,wait 必须使用 Table 实例上的锁(同步方法使用的锁)。 从 synchronized 方法中调用 wait 将释放 Table 实例上的锁(让其他线程有机会访问该实例),但调用 join 则不会。 由于 synchronized方法持有 Table 实例的锁,这意味着您的线程拒绝任何其他线程访问该 Table 实例,直到它加入的任何线程完成。虽然 join 是使用等待实现的,但它等待的是来自正​​在加入线程的监视器的通知,而不是 Table 对象的通知,因此 Table 实例上的锁永远不会被释放,直到该方法完成,这取决于连接完成。线程在持有锁时处于休眠状态;如果其他线程需要访问此 Table 对象,那么您将拒绝使用此方法访问其他线程。

所以(假设您添加了一些逻辑来提供对当前线程需要加入的任何一个或多个线程的引用)您可以这样做,但这看起来很糟糕。线程应该尽量减少他们持有锁的时间。可能像 CyclicBarrier 这样的更高级别的构造在这里可能会有用(尽管您在执行此操作时仍然不应该持有锁)。