zoukankan      html  css  js  c++  java
  • 线程

    一、什么是多线程

      进程可以简单的理解为一个可以独立运行的程序单位。它是线程的集合,进程就是有一个或多个线程构成的,每一个线程都是进程中的一条执行路径

      多线程就可以理解为:一个进程中同时又多个执行路径(线程)正在执行 

    为什么要是用多线程?

      1.在一个程序中,有很多的操作是非常耗时的,如数据库读写操作,IO操作等,如果使用单线程,那么程序就必须等待这些操作执行完成之后才能执行其他操作。使用多线程,可以在将耗时任务放在后台继续执行的同时,同时执行其他操作。

      2.可以提高程序的效率。

      3.在一些等待的任务上,如用户输入,文件读取等,多线程就非常有用了。

      缺点:

      1.使用太多线程,是很耗系统资源,因为线程需要开辟内存。更多线程需要更多内存。

      2.影响系统性能,因为操作系统需要在线程之间来回切换。

      3.需要考虑线程操作对程序的影响,如线程挂起,中止等操作对程序的影响。

      4.线程使用不当会发生很多问题。

      总结:多线程是异步的,但这不代表多线程真的是几个线程是在同时进行,实际上是系统不断地在各个线程之间来回的切换(因为系统切换的速度非常的快,所以给我们在同时运行的错觉)

    二、线程的创建

    线程创建的方法:

      1. 创建一个Thread类,或者一个Thread子类的对象

        Thread类是一个线程类,位于java.lang包下

    构造方法 

    常用方法

      2.创建一个实现Runnable接口的类的对象

        只有一个方法run();

        Runnable是Jave中用以实现线程的接口

        任何实现线程功能的类都必须实现该接口

    代码:通过继承Thread类的方式创建线程类,重写run()方法

    package com.mpp.thread;
    
    //定义一个类继承Thread,实现run方法
    class MyThread extends Thread{
        public void run(){
            System.out.println(getName()+"这个线程正在执行!");
        }
    }
    public class ThreadTest {
        public static void main(String[] args) {
    //        System.out.println("主线程1");
            MyThread mt = new MyThread();
            mt.start();  //启动线程(注意:1.一个线程只能执行一次;2.启动线程用stat,执行run中的代码,而不是调用run方法)
    //        System.out.println("主线程2");
    //        mt.start(); 编译ok执行异常
        }
    }

    代码二:通过实现Runnable接口的方式创建线程

    为什么要实现Runnable接口?

    --Java不支持多继承

    --不打算重写Thread类的其他方法

    package com.mpp.runnable;
    
    class PrintRunnable implements Runnable{
        int i= 1;   //t1h和t2一共执行10次
        @Override
        public void run() {
    //        int i = 1;  //t1和t2一共执行20次,各执行10次
            while (i<10)
            System.out.println(Thread.currentThread().getName()+"正在运行"+i++);
        }
    }
    public class Test {
        public static void main(String[] args) {
            PrintRunnable pr = new PrintRunnable();//创建PrintRunnable对象
            Thread t1 = new Thread(pr);  //创建Thread对象,并把pr传入
            t1.start();//启动线程
    
    //        PrintRunnable pr1 = new PrintRunnable();//创建PrintRunnable对象
            Thread t2 = new Thread(pr);  //创建Thread对象,并把pr传入
            t2.start();//启动线程
        }
    }

    三、线程的状态和生命周期

    1. 线程的状态

      -新建(New)

      -可运行(Runnable)

      -正在运行(Running)

      -阻塞(Blocked)

      -终止(Dead)

    2. 线程的生命周期

    (1)sleep方法的使用

    package com.mpp.runnable;
    
    class MyThread implements Runnable{
        @Override
        public void run() {
            for(int i=0;i<30;i++){
                System.out.println(Thread.currentThread().getName()+"执行第"+i+"次!");
                try{
                Thread.sleep(1000);
                }
                catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        }
    }
    public class SleepDemo {
        public static void main(String[] args) {
            MyThread mt = new MyThread();
            Thread t = new Thread(mt);
            t.start();
            Thread t1 = new Thread(mt);
            t1.start();
        }
    }

    四、线程调度

    五、同步与死锁

  • 相关阅读:
    Virtualbox-CentOS网络配置
    使用phpmyadmin创建数据库
    Vue CLI的使用
    webpack3的使用
    Vue组件化之插槽
    Vue组件化开发
    Vue高级技巧
    Vue基础学习笔记
    Git解决冲突和diff用法
    Git常用命令举例
  • 原文地址:https://www.cnblogs.com/mpp0905/p/10425021.html
Copyright © 2011-2022 走看看