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

Java 我们可以把线程连接方法放在同步方法中吗,java,multithreading,synchronized,Java,Multithreading,Synchronized,我可以在同步方法中使用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吗

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);}  
   }  
 }  
}  
类表{
同步的void打印表(int n){//synchronized方法
对于(inti=1;i首先:它不是一个静态方法,因此Thread.join无法工作。
是的,您可以调用。没有编译或运行时异常,但请考虑下面两点,可能是您不想以后再这样做。 加入一个线程意味着一个线程等待另一个线程结束,以便您可以安全地访问其结果,或者在两个线程都完成其作业后继续。所有重载的join()版本都是最终版本,并且是同步的。
同步方法提供了防止线程干扰和内存一致性错误的简单策略:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都通过同步方法完成。

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

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

首先:它不是静态方法,因此thread.join无法工作。
是的,您可以调用。没有编译或运行时异常,但请考虑下面两点,可能是您不想以后再这样做。 加入一个线程意味着一个线程等待另一个线程结束,以便您可以安全地访问其结果,或者在两个线程都完成其作业后继续。所有重载的join()版本都是最终版本,并且是同步的。

同步方法为防止线程干扰和内存一致性错误提供了一种简单的策略:如果一个对象对多个线程可见,则对该对象变量的所有读写都是通过同步方法完成的。

现在还不清楚您试图在这里做什么。您可能误解了它的含义他使用了synchronized关键字,并且在示例中使用了锁

Thread.join();
无效,因为它是一个实例方法。不清楚您实际要加入哪个线程。您需要提供一个引用,以引用要等待终止的线程

以下是:

join方法允许一个线程等待另一个线程的完成。如果t是线程当前正在执行的线程对象

t.join();

导致当前线程暂停执行,直到t的线程终止。join的重载允许程序员指定等待时间。但是,与睡眠一样,join的计时依赖于操作系统,因此您不应假设join将完全按照您指定的时间等待

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

在您的评论中,当您询问:

关于我可以使用thread.join而不是wait的简单问题

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


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

不清楚您在这里尝试执行的操作。您可能误解了synchronized关键字的作用