多线程

线程简介

进程

进程是执行程序的一次执行过程,它是一个动态概念,是系统资源分配的单位

线程

通常一个进程中可以包含若干个线程,一个进程至少有一个进程。线程是CPU调度和执行的单位。

注意:

很多多线程是模拟出来的,真正的多线程是指多个CPU,即多核,如服务器。如果是模拟出来的多线程,即在一个CPU的情况下,在同一时间点,CPU只能执行一个代码,因为切换快,所以就有同时执行的错觉。

线程实现(重点)

三种方法:

  1. Thread类:继承Thread类(重点)

    ①自定义线程类继承Thread类

    ②重写run()方法,编写线程执行体

    ③创建线程对象,调用start()方法启动线程

    public class TestThread1 extends Thread{
        @Override
        public void run() {
            for (int i=0;i<100;i++)
            System.out.println("我在看代码"+i);
        }
    
        public static void main(String[] args) {
    
            //创建一个线程对象
            TestThread1 testThread1 = new TestThread1();
            //调用start方法开启线程
            testThread1.start();
            
            for (int i = 0; i < 1000; i++) {
                System.out.println("我在学习多线程"+i);
            }
        }
    
  2. Runnable接口:实现Runnable接口(重点)

    ①定义一个类实现Runnable接口

    ②实现run()方法,编写 线程体

    ③创建线程对象,调用start()方法启动线程

    public class TestThread2 implements Runnable{
        @Override
        public void run() {
            //run方法线程体
            for (int i=0;i<100;i++)
                System.out.println("我在看代码------------------"+i);
        }
    
        public static void main(String[] args) {
            //创建Runnable接口的实现类对象
            TestThread2 testThread2 = new TestThread2();
            //创建一个线程对象,通过线程对象来开启线程代理
    //        Thread thread = new Thread(testThread2);
    //        thread.start();
            new Thread(testThread2).start();
            
            for (int i = 0; i < 1000; i++) {
                System.out.println("我在学习多线程"+i);
            }
        }
    }
    
  3. Callable接口:实现Callable接口

    ①定义一个类实现Callable接口

    ②重写call()方法

    ③创建执行服务

    ④提交执行

    ⑤获取结果

    ⑥关闭服务

线程状态

五个状态:NEW、RUNNABLE、BLOCKED、WAITTING、TIMED WAITTING、TERMINATED

线程状态

线程同步(重点)

多个线程操作同一个资源

理解:

处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象 ,这时候我们就需要线程同步,线程同步其实是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用。

为了保证数据在方法中被访问时的正确性,在访问时加入锁机制(synchronized),当一个线程获得对象的排他锁,独占资源,其他线程必须等待,使用后释放锁即可

两种用法:synchronized方法和synchronized块

  1. 同步方法无需指定同步监视器,因为同步方法的监视器就是this或者class。

  2. synchronized块:

    synchronized(obj){ },obj称之为同步监视器,可以是任何对象,但推荐使用共享资源作为同步监视器

posted @ 2021-04-07 23:52  狂神-小白  阅读(88)  评论(0)    收藏  举报