线程
-
前言:
线程有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元,与进程区别最大的一点是:进程内的线程之间可以共享数据和代码,而进程之间是相互隔离的。 线程是Java并发编程中的核心。
-
线程创建:
创建Java线程通常有两种方式,第一种为继承Thread,然后通过new关键字创建;第二种为实现Runnable接口,然后通过new Thread(Runnable runnble)创建。两种方式示例如下:-
继承Thread,重写run方法
private class MyThread extends Thread{ @Override public void run() { System.out.println(Thread.currentThread().getName() + " is running"); }}
-
直接或间接实现Runnable,重写run方法
private class MyRunnable implements Runnable{ @Override public void run() { System.out.println("my runnble is running"); }}
-
-
线程的本质
-
通过Thread类的native方法,这些方法调用操作系统底层函数完成线程的创建、运行、阻塞、等待、终止。Runnable只是一个接口,通过重写Runnable的run方法向Thread中传递需要执行的业务逻辑。
-
在调用new Thread()时只是使用init方法将一些基础的属性进行初始化,比如线程组,一个线程真正的开始是通过调用native的start0方法。
-
-
一个坑
直接调用Thread的run方法使用的还是当前线程,从查看Thread源码可以发现run方法的实现如下:/* What will be run. */private Runnable target;
-
@Overridepublic void run() { if (target != null) { target.run(); }}
正确的方式是调用start方法,start方法调用native的start0()方法,start0()会调用操作系统底层创建线程后,调用run方法,一个示例如下:public static void main(String[] args) { //错误的调用方法 MyThread myThread = new MyThread(); myThread.run(); //正确的调用方法 myThread.start();}//输出结果main is runningThread-0 is running
参考书籍及网址:
- 《Java并发编程的艺术》
- 《深入理解Java虚拟机》
PS:研究基于MAC+Idea+JDK1.8 64位
Keep Calm and Carry on!