zoukankan      html  css  js  c++  java
  • Java多线程学习笔记(一)

    一 概述

    一个进程只有一个至少会运行一个线程,Java中同样存在这样,在调用main方法的时候,线程又JVM所创建。

    1 package link.summer7c.test;
    2 
    3 public class Test{
    4     public static void main(String[] args){
    5         System.out.println(Thread.currentThread().getName());
    6     }
    7 }

    运行结果:main

    叫做main的线程正在执行main()方法中的代码。但是main和main方法并没有什么关系,只是因为名字相近而已。

    二 Java多线程的实现

    Java的JDK中,实现多线程有两种方法,一种是继承Thread类,另一种是实现Runnable接口。

    继承Thread方法:

     1 package link.summer7c.test;
     2 
     3 public class Test extends Thread{
     4     public void run(){
     5         super.run();
     6         System.out.println("The Test!");
     7     }
     8     public static void main(String[] args){
     9         Test test=new Test();
    10         test.start();
    11         System.out.println(Thread.currentThread().getName());
    12     }
    13 }

    运行结果:

    main
    The Test!

    按照程序来看,应该先输出The Test。在输出main,但是结果却不是如此这就说明在运行多线程的时候运行结果和代码的顺序是没有关系的。

    所以,线程是一个子任务,CPU是以不确定的方式来执行的。

    然后再看看Thread的源代码:

    1 public class Thread implements Runnable

    说明Thread类实现了Runnable类,他们之间有多态关系。

    验证线程的随机性可以在运行两个线程,同时循环输出,则会发现两个线程并不是顺序执行:

     1 package link.summer7c.test;
     2 
     3 public class Test{
     4     public static void main(String[] args){
     5         MyThread myThread=new MyThread();
     6         myThread.setName("MyThreadRun");
     7         myThread.start();
     8         for(int i=0;i<10;i++){
     9             System.out.println("main="+Thread.currentThread().getName());
    10         }
    11     }
    12 }
    13 
    14 class MyThread extends Thread{
    15     public void run(){
    16         for(int i=0;i<10;i++){
    17             System.out.println("run="+Thread.currentThread().getName());
    18         }
    19     }
    20 }

    结果:

    main=main
    run=MyThreadRun
    run=MyThreadRun
    main=main
    run=MyThreadRun
    main=main
    run=MyThreadRun
    main=main
    run=MyThreadRun
    main=main
    run=MyThreadRun
    main=main
    run=MyThreadRun
    main=main
    run=MyThreadRun
    main=main
    run=MyThreadRun
    main=main
    run=MyThreadRun
    main=main

    start方法不是启动程序的方法,所有的start是并发执行的。

    实现Runnable接口:

     1 package link.summer7c.test;
     2 
     3 public class Test{
     4     public static void main(String[] args){
     5         Runnable myThread=new MyThread();
     6         Thread theThread=new Thread(myThread);
     7         theThread.start();
     8         System.out.println("Main Run!");
     9     }
    10 }
    11 
    12 class MyThread implements Runnable{
    13     @Override
    14     public void run() {
    15         System.out.println("线程运行!");
    16     }
    17     
    18 }

    从这里可以看出来,实现了Runnable接口之后还是要new一个Thread对象,这里我很疑惑,既然Runnable是多线程的接口为什么没有start方法呢,接下来我看了源码:public

    interface Runnable {
      public abstract void run();
    }

    原来Runnable接口中没有start,所以start的方法是在Thread中写出来的,所以我又看了Thread的源代码,发现了start方法。

    1  start0();

    在strat方法中调用了start0方法,这个方法是这样写的:

    private native void start0();

    可以看出,这个方法已经涉及到了操作系统的接口了,很可能是用C/C++写出来的,这里就不深入探究了。

    =========================================

  • 相关阅读:
    1144 The Missing Number (20分)
    1145 Hashing
    1146 Topological Order (25分)
    1147 Heaps (30分)
    1148 Werewolf
    1149 Dangerous Goods Packaging (25分)
    TypeReference
    Supervisor安装与配置()二
    谷粒商城ES调用(十九)
    Found interface org.elasticsearch.common.bytes.BytesReference, but class was expected
  • 原文地址:https://www.cnblogs.com/Summer7C/p/5001629.html
Copyright © 2011-2022 走看看