在使用线程时,写这样的东西是很常见的:
Runnable r = new Runnable()
{
public void run() { /* ... */ }
};
new Thread(r).start();
这一切都很好而且正确,但我相信可以通过更高效、更简单的方式实现同样的目标:
new Thread()
{
public void run() { /* ... */ }
}.start();
但是,在使用 Threads
和 Runnable
的代码示例中,我几乎从未见过这样的事情。使用第一个示例而不是第二个示例是否有任何技术或样式相关的原因?
因为
Runnable r = new Runnable()
{
public void run() { /*your code */ }
};
new Thread(r).start();
new Thread(r).start();
new Thread(r).start();
new Thread(r).start();
等于
new Thread()
{
public void run() { /* ... */ }
}.start()
new Thread()
{
public void run() { /* ... */ }
}.start();
new Thread()
{
public void run() { /* ... */ }
}.start();
new Thread()
{
public void run() { /* ... */ }
}.start();
它们并不完全相等。在第一种情况下,所有线程在第二种情况下共享相同的可运行对象,但它们不会。在第一种情况下,写入 volatile 字段(或者如果存在 happens-before ),将对其他线程可见。