• 多线程


    多线程介绍

      进程: 进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能

      线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序

    程序运行原理

    l  分时调度        所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间

    l  抢占式调度  优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。

    CPU(中央处理器)使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是在同一时刻运行。

    多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高

    主线程 jvm启动后,必然有一个执行路径(线程)从main方法开始的,一直执行到main方法结束

    多线程内存图

     

    创建新执行线程有两种方法

    一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。创建对象,开启线程。run方法相当于其他线程的main方法。

    另一种方法是声明一个实现 Runnable 接口的类。该类然后实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程

    创建线程方式一继承Thread类

    创建线程的步骤:

    1 定义一个类继承Thread。

    2 重写run方法。

    3 创建子类对象,就是创建线程对象。

    4 调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法  

    注意:线程对象调用run方法不开启线程。仅是对象调用方法。线程对象调用start开启线程,并让jvm调用run方法在开启的线程中执行

    Thread.currentThread()获取当前线程对象

    getName() 得到线程名称 

    代码:

    package com.oracle.demo04;
    
    public class MyThread extends Thread{
    	//重写run方法来描述线程任务
    	public void run() {
    		for (int i = 0; i <100; i++) {
    			//getName() 得到线程名称
    			System.out.println(Thread.currentThread().getName()+":"+i);
    		}
    	}
    }
    
    package com.oracle.demo04;
    
    public class Democracy {
    	public static void main(String[] args) {
    		//创建线程
    		MyThread mt=new MyThread();
    		//开启线程
    		mt.start();
    		//获取相城对象
    		//描述主线程任务
    		for (int i = 0; i < 100; i++) {
    			System.out.println(Thread.currentThread().getName()+":"+i);
    		}
    	}
    }
    

      

     创建线程方式—实现Runnable接口

    创建线程的步骤。

    1、定义类实现Runnable接口。

    2、覆盖接口中的run方法。。

    3、创建Thread类的对象

    4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数。

    5、调用Thread类的start方法开启线程

    package com.oracle.Demo;
    //线程任务类
    public class Myrunnable implements Runnable{
    	//描述线程任务
    	@Override
    	public void run() {
    		for (int i = 0; i <100; i++) {
    			System.out.println(Thread.currentThread().getName()+":"+i);
    		}
    		
    	}
    }
    package com.oracle.Demo;
    
    public class Demo01 {
    
    	public static void main(String[] args) {
    		// 创建线程任务对象
    		Myrunnable mr=new Myrunnable();
    		//创建线程对象
    		Thread th=new Thread(mr);
    		//开启线程任务
    		th.start();
    		//描述主线程任务
    		for (int i = 0; i < 100; i++) {
    			System.out.println(Thread.currentThread().getName()+":"+i);
    		}
    	}
    
    }
    

      

     实现Runnable的好处     

      避免了单继承的局限性,所以较为常用

      更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务

      降低耦合性

    线程的匿名内部类使用

    使用线程的内匿名内部类方式,可以方便的实现每个线程执行不同的线程任务操作。

    package com.oracle.Demo;
    
    public class Demo02 {	
    	
    		/*匿名内部类格式
    		 * 父类类型 或接口   对象名=new 父类类型或接口i{
    		 * 重写父类方法
    		 * }
    		 * 
    		 * 
    		 * */
    	public static void main(String[] args) {
    		//继承Tread的方式
    		Thread th=new Thread(){
    			public void run(){
    				for (int i = 0; i <100; i++) {
    					//getName() 得到线程名称
    					System.out.println(Thread.currentThread().getName()+":"+i);
    				}
    			}
    		};
    		//开启线程
    		th.start();
    		//2.实现Runnable 接口方式
    		Runnable r=new Runnable() {
    			public void run() {
    				for (int i = 0; i <100; i++) {
    					//getName() 得到线程名称
    					System.out.println(Thread.currentThread().getName()+":"+i);
    				}
    			}
    		};
    		//创建线程对象
    		Thread th2=new Thread(r);
    		//开启线程
    		th2.start();
    	}
    }
    

      

     

  • 相关阅读:
    PID控制算法原理(抛弃公式,从本质上真正理解PID控制)(转)
    用三张图片详解Asp.Net 全生命周期
    Maven 3 入门 核心概念
    Maven 3 入门 HelloWorld
    Spring 3.x MVC 入门3 使用内容协商来实现多视图
    Nosql之Mongodb 1 安装配置与基本操作
    Spring 3.x MVC 入门31 使用内容协商来实现多视图 示例
    Nosql之Mongodb 2 高级查询
    Maven 3 入门 如何创建一个web应用程序
    Spring 3.x MVC 入门4 @ResponseBody & @RequestBody
  • 原文地址:https://www.cnblogs.com/zqy6666/p/12309365.html
Copyright © 2020-2023  润新知