Java基础总结记录(六):多线程

简介
每次学习或者总结的时候,都应该带着问题去想去思考,这样才能理解的更深刻。那么对于多线程,相信好多人碰到过,那么我们来看看多线程。
一、进程和线程
进程:是指处于运行过程中的程序,并且具有一定的独立功能。进程是系统进行资源分配和调度的一个单位。当程序进入内存运行时,即为进程。
每次看到这种官方描述,相信大家都会比较头疼,那我们来简单描述一下:程序至少要有一个进程,进程之间是独立的,是资源分配和调度的一个单位。
线程:进程至少有一个线程,同个进程内多个线程资源共享,是cpu调度的基本单元。
二、线程生命周期
有5种状态:新建、就绪、运行、阻塞、死亡。
用一副图片来展示一下线程的生命周期
Java基础总结记录(六):多线程_第1张图片
描述:

  1. 新建:创建一个线程 new Thread。
  2. 就绪:当前线程调用start()方法进入就绪状态,有执行资格没有执行权限。
  3. 运行:线程抢到了cpu执行权限,就进入运行状态。
  4. 阻塞:造成线程阻塞分类比较多,上面的图片划分出来。这就不一一叙述了,简单说一下,阻塞状态让出cpu资源给别的线程使用,类别不同,执行的状态也不一样。
  5. 死亡:线程执行完毕,线程就死亡了。(这块需要说的是,线程池中的线程会回到线程池中,系统重启的时候,线程池中的线程才会消失)

三、线程API
sleep()方法

package com.guo;
public class ThreadTest extends Thread{
    /**
     * 需求:主线程执行5,两个子线程执行10次,每执行一次睡个1秒
     */
    public void run() {
        for (int i = 1; i <= 10; i++) {
            System.out.println("我是子线程:"+getName()+"====执行次数:"+i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        ThreadTest t1 = new ThreadTest();
        ThreadTest t2 = new ThreadTest();
        for (int i = 1; i <= 5; i++) {
            System.out.println("我是主线程:"+Thread.currentThread().getName()+"====执行次数"+i);
        }

        t1.start();
        t2.start();
    }
}

结果:
Java基础总结记录(六):多线程_第2张图片
我们知道实现线程有4种方法,上面我们用的继承Thread,接下来我们来实现Runnable。
继承Thread类不适合资源共享,实现Runnable接口更具有灵活性。
wait()方法一般和notity配合使用

package com.guo;

public class Thread_Runnable{

    int a = 0;

    public synchronized void off(){
        try {
            System.out.println("进入off()方法");
            this.wait(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+":"+a);
        a +=1;
        this.notify();
    }
    public synchronized void on(){
        try {
            System.out.println("进入on()方法");
            this.wait(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+":"+a);
        a +=1;
        this.notify();
    }

    public static void main(String[] args) {

        Thread_Runnable t1 = new Thread_Runnable();
        Thread t2 = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for (int i = 0; i < 5; i++) {
                            t1.on();
                        }

                    }
                }, "线程1");
        t2.start();
        Thread t3 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i <5 ; i++) {
                    t1.off();
                }
            }
        },"线程2");
        t3.start();

    }

}

结果:
Java基础总结记录(六):多线程_第3张图片
yield()方法

package com.guo;
public class Thread_yield {
    public static void main(String[] args) {
        Thread t1 = new FirstThread();
        Thread t2 = new SecodeThread();
        t1.setPriority(Thread.MIN_PRIORITY);
        t2.setPriority(Thread.MAX_PRIORITY);
        t1.start();
        t2.start();
    }
    static class FirstThread extends Thread {
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName()+":"+ i);
//                Thread.yield();
            }
        }
    }
    static class SecodeThread extends Thread {
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName()+":"+ i);
//                Thread.yield();
            }
        }
    }
}

结果:无礼让的效果
Java基础总结记录(六):多线程_第4张图片
结果:礼让的结果
Java基础总结记录(六):多线程_第5张图片

你可能感兴趣的:(JAVA基础记录)