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
是毫无意义的,因为没有必要保护数据
不受其他线程的并发访问(同样,您正在此
上同步,我认为其他线程不会在同一对象上同步)
另请参见:
synchronized
关键字的含义
Synchornized不是一种“原子”或“不间断”块
Synchornized块不提供任何保证,除了其他线程不能同时进入同一对象上的synchronized块(本例中为this
)(+一些与本例无关的内存一致性保证)
因此,在您的情况下使用synchornized
是毫无意义的,因为没有必要保护数据
不受其他线程的并发访问(同样,您正在此
上同步,我认为其他线程不会在同一对象上同步)
另请参见:
- 暂时忽略
while(true)
将线程放入CPU循环中
如果sendMail
执行任何检查线程中断的操作,它将抛出中断的异常。因此,您的问题的答案很可能是肯定的,线程可能会在同步块中中断,您必须捕获异常并进行检查
这就是说,InterruptedException是一个已检查的异常,因此除了在较低级别上执行有趣的bug之外,sendMail应该表明它可以抛出InterruptedException。暂时忽略
,而(true)
将线程放入CPU循环
如果sendMail
执行任何检查线程中断的操作,它将抛出中断的异常。因此,您的问题的答案很可能是肯定的,线程可能会在同步块中中断,您必须捕获异常并进行检查
这就是说,InterruptedException是一个已检查的异常,因此除了在较低级别上执行有趣的bug之外,sendMail应该表明它可以抛出InterruptedException。这很糟糕。。。我做了一个快速测试,我可以在同步块中间插入线程。糟糕…在这种情况下,为什么需要
synchronized
?我希望sendMail()和设置为空是原子的。是否希望此线程(即sendMail)暂停,直到测试线程完成,这就是您想要实现的,并且您正在中断。我只想确保在发送邮件后,数据将因此为空