首页 > Java > java教程 > Java -- 多线程

Java -- 多线程

高洛峰
发布: 2016-11-21 11:09:07
原创
1994 人浏览过

  多线程的实现方法:

    继承Thread类

    实现Runnable类

  -------------------------------------------------------------------------------------

  1. 继承Thread类

    继承Thread类之后,需要覆盖父类的 public void run() 方法,作为线程的主方法。

    所有线程的执行一定是并发的,即:同一个时间段上会有多个线程交替执行。为了达到这样的目的,绝对不能直接调用run()方法,而是应该调用Thread类的start()方法启动多线程。

    调用 start() 方法和调用 run() 方法的对比:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public class MyThread extends Thread {

    private String name;

    public MyThread(String name) {

        this.name = name;

    }

     

    @Override

    public void run() {

        for(int i=0; i<10; i++) {

        System.out.println(name + "打印:" + i);

        }

    }

     

    public static void main(String[] args) {

        MyThread mt1 = new MyThread("线程A");

        MyThread mt2 = new MyThread("线程B");

        MyThread mt3 = new MyThread("线程C");

        mt1.start();

        mt2.start();

        mt3.start();

    }

}

登录后复制

  运行结果:(三个线程同时且交替执行,没有固定的执行顺序)

93878112023111.jpg

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public class MyThread extends Thread {

    private String name;

    public MyThread(String name) {

        this.name = name;

    }

     

    @Override

    public void run() {

        for(int i=0; i<5; i++) {

        System.out.println(name + "打印:" + i);

        }

    }

     

    public static void main(String[] args) {

        MyThread mt1 = new MyThread("线程A");

        MyThread mt2 = new MyThread("线程B");

        MyThread mt3 = new MyThread("线程C");

        mt1.run();

        mt2.run();

        mt3.run();

    }

}

登录后复制

 运行结果:(三个程序依次顺序执行)

93878112023111.jpg

  2. start()方法实现多线程的原理

    打开Thread类源代码中start()方法的部分:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public synchronized void start() {

        if (threadStatus != 0)

            throw new IllegalThreadStateException();

        group.add(this);

        boolean started = false;

        try {

            start0();

            started = true;

        } finally {

            try {

                if (!started) {

                    group.threadStartFailed(this);

                }

            } catch (Throwable ignore) {

            }

        }

}

private native void start0();

登录后复制

  native关键字是指调用操作系统的方法,start0()方法是所在操作系统的方法。

    由于线程的启动需要牵扯到操作系统中资源的分配问题,所以具体的线程的启动应该根据不同的操作系统有不同的实现。而JVM根据不同的操作系统中定义的start0()方法进行不同的实现。这样,在多线程的层次上start0()方法的名称不改变,而不同的操作系统有不同的实现。

93878112023111.jpg

原理图

    结论:只有Thread类的start()方法才能进行操作系统资源的分配,所以启动多线程的方式永远就是Thread类的start()方法。


相关标签:
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
java可以做为web的后端吗?
来自于 1970-01-01 08:00:00
0
0
0
安装JAVA
来自于 1970-01-01 08:00:00
0
0
0
无法安装java
来自于 1970-01-01 08:00:00
0
0
0
java - php调取webservice的map类型,如果封装?
来自于 1970-01-01 08:00:00
0
0
0
这个是Java语言的吗
来自于 1970-01-01 08:00:00
0
0
0
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板