主线程如何在此线程之前运行?

时间:2016-07-07 19:06:58

标签: java multithreading synchronization

我有以下代码:

    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 个答案:

答案 0 :(得分:3)

  

主线程怎么能在' t1'之前调用setA?如果对象被t1锁定?

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

  

只是调度程序

这是其中的一部分。但事实上,开始一个线程并不是免费的,并且需要花费大量的时间。

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();
    }
}