zoukankan      html  css  js  c++  java
  • 【多线程学习(1)】创建java多线程

    1)java多线程的创建方式有三种:

    1.继承Thread类

    2.实现Runnable接口

    3.实现Callable接口

    第一种:

    1        //继承Thread类
    2     class ExtendsThread extends Thread{
    3         public void run(){
    4             //do your stuff
    5         }
    6     }
    7     ExtendsThread e = new ExtendsThread();
    8     e.start();
    View Code

    第二种:

     1          //实现Runnable接口
     2     class ImpleRunnableThread implements Runnable{
     3         @Override
     4         public void run() {
     5             //do your stuff
     6         }
     7     }
     8     ImpleRunnableThread ir = new ImpleRunnableThread();
     9     Thread t = new Thread(ir);
    10     t.start();
    View Code

    第三种是jdk1.5以后提供的:

     1          //实现Callable接口
     2     class ImpleCallableThread implements Callable{
     3         @Override
     4         public Object call() throws Exception {
     5             // TODO do you stuff
     6             return null;
     7         }
     8     }
     9     ImpleCallableThread ic = new ImpleCallableThread();
    10     FutureTask<String> task = new FutureTask<String>(ic);
    11     new Thread(task,"有返回值的线程").start();
    View Code

    2)可以看到线程启动用的是start这个方法,为什么呢?打开start()源码可以看到,在Thread类里start()调用了 private native void start0();native关键字表示调动的是操作系统的底层函数,这样的技术成为JNI(Java Native Interface)。

    3)看看线程的执行顺序情况:

    1 for(int i =0;i<5;i++){
    2             Thread thread = new Thread(""+i){
    3                 public void run() {
    4                     System.out.println("run...."+ getName());
    5                 }
    6             };
    7             thread.start();
    8         }
    View Code

    output:

        

    虽然启动线程的顺序是有序的,但是执行线程的顺序并非是有序的,因为线程是并行执行而非顺序的,它的执行顺序由JVM和操作系统一起决定。

    4)如果同时使用继承Thread类、Runnable接口这两种的话,执行的是哪个run方法呢?

     1 new Thread(new Runnable(){
     2             @Override
     3             public void run() {
     4                 // do your stuff 1
     5             }
     6         }){
     7             public void run(){
     8                 //do your stuff  2
     9             }
    10         };
    View Code

    以上代码相当于new Thread(new Runnable(){run()}){run()},由于Thread类本身实现了Runnable接口,所以如果自身重写了run方法的话,那么就会覆盖父类的方法,所以会执行第二个run方法。

    下一篇说明这三种创建方式的区别。

  • 相关阅读:
    聊聊Flame Graph(火焰图)的那些事
    Dynamometer:HDFS性能扩展测试工具
    论分布式系统中单一锁控制的优化
    聊聊磁盘数据的损坏
    分级副本存储:一种更具效益成本的数据容错策略
    分布式存储系统中的Data Scrubbing机理
    论一个成熟分布式系统的工具类设计
    聊聊Raft一致性协议以及Apache Ratis
    ListenableFuture的状态同步和原子更新
    2018-9-1-win10-uwp-轻量级-MVVM-框架入门-2.1.5.3199
  • 原文地址:https://www.cnblogs.com/superFish2016/p/5954004.html
Copyright © 2011-2022 走看看