Java 一个线程可以在运行(和)和x27的中间中断吗?什么是同步块?

Java 一个线程可以在运行(和)和x27的中间中断吗?什么是同步块?,java,multithreading,Java,Multithreading,我正在编写一个简单的线程应用程序。线程只是一个消息使用者,并对其进行处理。但是,如果线程以某种方式被中断,并且消息没有得到完全处理,我希望将其放回队列,让其他实例获得它。所以我必须这样编码: public void run() { Map<String, String> data = null; try { while(true) { data = q.getData();

我正在编写一个简单的线程应用程序。线程只是一个消息使用者,并对其进行处理。但是,如果线程以某种方式被中断,并且消息没有得到完全处理,我希望将其放回队列,让其他实例获得它。所以我必须这样编码:

    public void run()
{
    Map<String, String> data = null;
    try
    {
        while(true)
        {
            data = q.getData();
            System.out.println(this+" Processing data: "+data);
            // let others process some data :)
            synchronized(this){
                sendEmail(data);
                data = null;
            }
        }
    } 
    catch (InterruptedException e)
    {
        System.out.println(this+" thread is shuting down...");
        if(null!=data) 
            q.add(data);
    }

}
public void run()
{
地图数据=空;
尝试
{
while(true)
{
data=q.getData();
System.out.println(此+“处理数据:”+数据);
//让其他人处理一些数据:)
已同步(此){
发送电子邮件(数据);
数据=空;
}
}
} 
捕捉(中断异常e)
{
System.out.println(这个+“线程正在关闭…”);
if(null!=数据)
q、 添加(数据);
}
}
谢谢

编辑:谢谢你的回复。现在一切都很清楚了。我理解,即使代码行在同步块中,如果其中任何一行可以抛出InterruptedException,那么这仅仅意味着它们可以在该点被中断。行q.getData()将此线程进入“阻塞”状态(我在q.getData()中使用LinkedBlockedQueue)。此时,该线程可以中断

是的

Java同步意味着,当一个线程获得了同一个锁时,其他线程无法访问该锁

如果您不希望任何其他线程能够访问消息(或任何其他对象),请使用
synchronized(message)
block。

Java同步意味着,当一个线程获得了同一个锁时,其他线程无法访问该锁


如果您不希望任何其他线程能够访问消息(或任何其他对象),请使用
synchronized(message)
块。

线程不会在其他线程调用它时捕获
中断异常
,该方法也不会神奇地停止它正在执行的任何操作。相反,该方法设置线程可以使用的标志。某些其他方法将检查此标志,并在设置时引发
InterruptedException
。例如,
Thread.sleep()
和许多等待外部资源的I/O操作都会抛出它


有关更多信息,请参阅。

一个线程在另一个线程调用它时不会捕获中断异常,该方法也不会神奇地停止它正在执行的任何操作。相反,该方法设置线程可以使用的标志。某些其他方法将检查此标志,并在设置时引发
InterruptedException
。例如,
Thread.sleep()
和许多等待外部资源的I/O操作都会抛出它


有关更多信息,请参见。

除了David Harkness的回答之外:您也不理解
synchronized
关键字的含义

Synchornized不是一种“原子”或“不间断”块

Synchornized块不提供任何保证,除了其他线程不能同时进入同一对象上的synchronized块(本例中为
this
)(+一些与本例无关的内存一致性保证)

因此,在您的情况下使用
synchornized
是毫无意义的,因为没有必要保护
数据
不受其他线程的并发访问(同样,您正在
上同步,我认为其他线程不会在同一对象上同步)

另请参见:


除了David Harkness的答案之外:您也不理解
synchronized
关键字的含义

Synchornized不是一种“原子”或“不间断”块

Synchornized块不提供任何保证,除了其他线程不能同时进入同一对象上的synchronized块(本例中为
this
)(+一些与本例无关的内存一致性保证)

因此,在您的情况下使用
synchornized
是毫无意义的,因为没有必要保护
数据
不受其他线程的并发访问(同样,您正在
上同步,我认为其他线程不会在同一对象上同步)

另请参见:


    • 暂时忽略
      while(true)
      将线程放入CPU循环中

      如果
      sendMail
      执行任何检查线程中断的操作,它将抛出中断的异常。因此,您的问题的答案很可能是肯定的,线程可能会在同步块中中断,您必须捕获异常并进行检查


      这就是说,InterruptedException是一个已检查的异常,因此除了在较低级别上执行有趣的bug之外,sendMail应该表明它可以抛出InterruptedException。

      暂时忽略
      ,而(true)
      将线程放入CPU循环

      如果
      sendMail
      执行任何检查线程中断的操作,它将抛出中断的异常。因此,您的问题的答案很可能是肯定的,线程可能会在同步块中中断,您必须捕获异常并进行检查


      这就是说,InterruptedException是一个已检查的异常,因此除了在较低级别上执行有趣的bug之外,sendMail应该表明它可以抛出InterruptedException。

      这很糟糕。。。我做了一个快速测试,我可以在同步块中间插入线程。糟糕…在这种情况下,为什么需要
      synchronized
      ?我希望sendMail()和设置为空是原子的。是否希望此线程(即sendMail)暂停,直到测试线程完成,这就是您想要实现的,并且您正在中断。我只想确保在发送邮件后,数据将因此为空