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();
        }
    }

    四、线程调度

    五、同步与死锁

  • 相关阅读:
    The Python Standard Library
    Python 中的round函数
    Python文件类型
    Python中import的用法
    Python Symbols 各种符号
    python 一行写多个语句
    免费SSL证书(https网站)申请,便宜SSL https证书申请
    元宇宙游戏Axie龙头axs分析
    OLE DB provider "SQLNCLI10" for linked server "x.x.x.x" returned message "No transaction is active.".
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "xxx.xxx.xxx.xxx" was unable to begin a distributed transaction.
  • 原文地址:https://www.cnblogs.com/mpp0905/p/10425021.html
Copyright © 2011-2022 走看看