2016-07-07 42 views
-1

我有以下代码:主线程如何在此线程之前运行?

public class Derived implements Runnable { 
     private int num; 

     public synchronized void setA(int num) { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
      } 
      System.out.println("Setting value " + Thread.currentThread().getName()); 
      this.num = num; 
     } 

    @Override 
    public void run() 
    { 
     System.out.println("In run: " + Thread.currentThread().getName()); 
     setA(20); 
    } 

     public static void main(String[] args) { 
      Derived obj = new Derived(); 
      Thread t1 = new Thread(obj); 
      t1.start(); 
      obj.setA(32); 
     } 
    } 

此打印:

In run: Thread-0 
Setting value main 
Setting value Thread-0 

我的问题是,如果我开始线程“T1”第一,它进入了run方法的输出显示,如何如果对象被t1锁定,主线程能够在't1'之前调用setA吗? (或者甚至在锁定'obj'main之前能够获得锁定)它只是调度程序还是我认为它错了?

+1

除非您采取明确的步骤来同步它们,否则没有关于使用线程排序的保证。这就是整个线程的重点,它们是异步的。 –

+1

调用此代码时,主线程已启动并正在运行。你的另一个线程只需要一点时间来构建和运行,所以我对你看到的结果并不感到惊讶。再加上@JimGarrison上面陈述的。 –

+0

你的代码也不应该编译 - 你的Runnable没有'run()'方法。 –

回答

3

如果对象被t1锁定,主线程如何在't1'之前调用setA?

使用多个线程的重点是允许每个线程中的代码独立运行。 Thread.start()(或任何方法)不是即时的。这需要时间,当你的线程开始时,你可以在当前线程中运行代码,实际上它可以在你的后台线程开始之前运行完成。

难道仅仅是调度

这是它的一部分。但是这也是事实,即启动一个线程不是免费的,并且需要花费很少的时间。

public class Test { 
    public static void main(String[] args) { 
     long start = System.nanoTime(); 
     new Thread(() -> System.out.println("Thread took " + 
       (System.nanoTime() - start)/1e6 + " ms to start")) 
       .start(); 
    } 
} 

我有一个快速的机器,但是当我运行这个程序来启动第一个线程需要一段时间。

Thread took 44.695419 ms to start 
+0

谢谢你的答案@ Peter.Great的解释。我正在尝试的是,当一个线程进入一个同步方法时,即使让线程休眠,其他线程也不能输入任何对象的同步方法。我对吗?另一个线程是否可以输入一个正在访问类数据的非同步? – Kode

+1

@Vwin正确的关于同步和睡眠,注意:如果你等待(),而另一个线程可以获得锁。如果没有同步,任何数量的线程都可以运行一个方法。 –

+0

太好了。感谢您的帮助 – Kode

相关问题