zoukankan      html  css  js  c++  java
  • Java thread(1)

    这一部分主要讨论 java多线程的基本相关概念以及两种java线程的实现方式:

    线程与进程:

        这个操作系统书上介绍得很详细,这里就列出一些比较主要的:

        线程: 线程本身有很少的资源,因为所拥有的资源较少,所以线程切换所花费在上下文切换的时候的开销也较少。线程是能够独立运行的最小的单位。多个线程之间共享进程所拥有的基本资源,线程之间对于某些数据的操纵可能会相互影响。

        进程: 运行当中的程序,多个进程之间,每个进程的内部数据对于其他进程而言是不可见的。

    采用多线程的目的:

        采用多线程的目的就是为了最大限度地利用cpu的资源,从进程的层次而言,操作系统会有自己的一套进程调度的机制,让进程尽量充分地使用cpu,从更小的粒度来划分,在一个进程运行的过程中也不可能完全占用着cpu,这样要想让cpu更充分地被使用,就将一个进程的执行划分为几个线程的执行,当某一线程的处理不需要占用CPU而只和I/O等资源打交道,让需要占用cpu的其他线程有机会获得cpu资源,线程之间可以进行灵活地切换,这样能让cpu被利用的更充分。

        当程序启动的时候会自动创建一个主线程,主方法main就是在主线程上运行,程序全由线程来执行。Java中内置了对于多线程编程的支持,多线程含两个或者两个以上并发运行的部分,利用多线程可以编写出cpu利用率最大的高校程序,使得cpu的空闲时间最多。

    Java中实现线程的两个基本方法:

        1继承Thread类 并且重写其中的run方法

        2继承Runnable接口 实现其中的run方法

    详细说明:

        1 采用继承Thread类的方式来实现多线程直接采用没有形参的构造方法生成新的Thread类。其中的run方法中的内容就是这个线程所需要完成的事情,线程的启动只能通过Thread类的start()方法来进行,只有这样程序才能和操作系统进行交互,按照线程的方式进行启动,直接调用run()方法实际上还是单线程的方式。start方法是不可以被重写的,否则线程就没法正常启动了。

        2 采用实现Runnuble接口的方式实现多线程机制的时候,生成新的线程类的时候要将这个Runnable接口传入,采用以下的构造方法:Thread(Runnable target) 注意,不管使用哪种方式实现一个线程,最终启动的时候还是要通过Thread类的start方法,只不过一个是继承Thread类之后,调用start启动,一个是构建新的Thread类的时候把已经实现了Runnable接口的类作为参数传递进来,最后再调用start方法。

    具体的例子:

    package com.javase.thread;
    
    public class threadTest {
        public static void main(String[]args){    
          //第一种方式实现
        Thread t11=new Thread1("mythread");
          //第二种方式实现 传入一个runnable参数
        Runnable r=new Thread2();
          Thread t2=new Thread(r);      
          //启动线程
          t11.start();
          t2.start();
        }
        
    }
    //注意这里要是重写构造方法的话 就要调用之前的 父类的构造方法 
        class Thread1 extends Thread{
            int i;
            public Thread1(){
                super();
            }
            public Thread1(String string) {
                super(string);
            }
            //重写run方法
            public void run()
            {
                for(i=0;i<5;i++)
                {System.out.println("the number for " + this.getName()+" is "+i);}    
            }
        }
        
        class Thread2 implements Runnable{
    
            @Override
            public void run() {
                int i;
                for(i=0;i<5;i++)
                {System.out.println("the number for is"+i);}
                
            }
            
        }
    //运行结果
    /*
    the number for mythread is 0
    the number for is0
    the number for mythread is 1
    the number for is1
    the number for mythread is 2
    the number for is2
    the number for mythread is 3
    the number for is3
    the number for mythread is 4
    the number for is4
    */

        上面的代码中用最基本的两个方法实现了两个线程,可以看到在Thread1中,为了给线程进行重命名,重写了构造方法,在其中调用了super(String),这个比较关键,这里实际上是调用了Thread类的Thread(String)的构造方法。在main函数中,通过将引用传入Thread类来生成一个新的线程,线程的名称采用默认的形式,之后我们会从具体代码的角度来分析两种线程实现机制的区别。

  • 相关阅读:
    UnityVS(Visual Studio Tools For Unity)的安装与使用
    Balsamiq Mockups注册码
    python基础之os.system函数
    jenkins配置记录(1)--添加用户权限
    chromedriver与chrome各版本及下载地址
    高阶面试官应掌握哪些面试技巧
    [面试技巧]16个经典面试问题回答思路
    自动代码质量分析(GitLab+JenKins+SonarQube)
    Git提交代码自动触发JenKins构建项目
    Allure 安装及使用
  • 原文地址:https://www.cnblogs.com/Goden/p/3819191.html
Copyright © 2011-2022 走看看