云计算

多线程相关问题(一)

2019-02-09  本文已影响142人  NealLemon

由于近期在做知识储备,在做很多的复习,把之前看过的内容重温一遍真的像重新看一遍一样,真的是一入JAVA深似海。

概念相关问题

1.线程和进程有什么区别?

线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

2.线程的状态有哪些?

Java线程状态转换.jpg

相关方法问题

1.start和run方法的区别?

在这里我们先写一段代码来实际感受一下这两个方法的区别。

/**
 * 针对run()和 start()区别的测试类
 */
public class ThreadTest {

    /**
     * 单纯打印执行内容以及当前线程的线程名
     */
    private static void doTest(String name) {
        System.out.println("使用"+ name + "方法调用doTest()");
        System.out.println("Current Thread is : " + Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        Thread startThread = new Thread() {
            @Override
            public void run() {
                doTest("start()");
            }
        };

        Thread runThread = new Thread() {
            @Override
            public void run() {
                doTest("start()");
            }
        };
        startThread.start();

        runThread.run();
    }

}

执行结果


结果.png
具体分析

我们先来看一下java.lang.Thread#start方法的源码

public synchronized void start() {
    /**
     * This method is not invoked for the main method thread or "system"
     * group threads created/set up by the VM. Any new functionality added
     * to this method in the future may have to also be added to the VM.
     *
     * A zero status value corresponds to state "NEW".
     */
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

    /* Notify the group that this thread is about to be started
     * so that it can be added to the group's list of threads
     * and the group's unstarted count can be decremented. */
    group.add(this);

    boolean started = false;
    try {
        start0();
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
            /* do nothing. If start0 threw a Throwable then
              it will be passed up the call stack */
        }
    }
}

上述源码中 实际启动的就是 start0();这个方法。我们查看源码可以看到 这个方法也是一个native方法。

private native void start0();

我们接着查看一下native中的相关源码。这里就直接给出源码以及重点,具体怎么查询的可以自行百度。

start.png start1.png

由上述的虚拟机源码,我们可以就可以看明白刚刚我们写的demo中的结果的原因了。

总结

图解:

总结.png

2.sleep()和wait()的区别?

3.notify() 和 notifyAll()的区别?

首先需要了解一下两个概念。

锁池
锁池.png
等待池
等待池.png

4.yield和join的区别?

5.调用Interrupt()函数

上一篇下一篇

猜你喜欢

热点阅读