浅识java多线程

目录

一 进程和线程定义

二 创建线程的种类

(1)继承java.lang.Thread

(2)实现java.lang.Runnable接口 

三 多线程

(1)继承java.lang.Thread多线程

(2)实现java.lang.Runnable接口多线程 

四 线程的状态

五 线程优先级

六 线程休眠

七 使用线程示例


一 进程和线程定义

        进程:应用程序的执行实例

        线程:CPU调度和分派的基本单位,进程中执行运算的最小单位

二 创建线程的种类

(1)继承java.lang.Thread

        a)定义MyThread类继承Thread类

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

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

package org.example.demo01;

//步骤1:定义Demo01类继承Thread类
public class Demo01 extends Thread{
    //步骤2:重写run()方法,编写线程执行体

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"\t"+i);
        }
    }

    public static void main(String[] args) {
        //步骤3:创建线程对象,调用start()方法启动线程
        Demo01 demo01 = new Demo01();
        demo01.start();
    }
}

 

(2)实现java.lang.Runnable接口 

        a)定义MyRunnable类实现Runnable接口

        b)实现run()方法,编写线程执行体

        c)创建线程对象,调用Thread类的start()方法启动线程

package org.example.demo01;

//步骤1:定义MyRunnable类实现Runnable接口
public class Demo03 implements Runnable{
    //步骤2:实现run()方法,编写线程执行体
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"\t"+i);
        }
    }

    public static void main(String[] args) {
        //步骤3:创建线程对象,调用Thread类的start()方法启动线程
        Demo03 demo03 = new Demo03();

        Thread demo03Thread = new Thread(demo03);

        demo03Thread.start();
    }
}

三 多线程

(1)继承java.lang.Thread多线程

        核心要点:多个线程之间存在交替执行,不是真正的并行

package org.example.demo01;

public class Demo02 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+" "+i);
        }
    }

    public static void main(String[] args) {
        Demo02 a1 = new Demo02();
        Demo02 a2 = new Demo02();
        a1.start();
        a2.start();
    }
}

(2)实现java.lang.Runnable接口多线程 

package org.example.demo01;

public class Demo04 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"\t"+i);
        }
    }

    public static void main(String[] args) {
        Demo04 demo04 = new Demo04();

        Thread myThread01 = new Thread(demo04);
        Thread myThread02 = new Thread(demo04);

        myThread01.start();
        myThread02.start();
    }
}

四 线程的状态

  1. 正常情况下流程:创建状态——》就绪状态——》运行状态——》死亡状态
  2. 异常情况下流程:创建状态——》就绪状态——》运行状态——》阻塞(休眠)状态——》就绪状态——》运行状态——》死亡状态

浅识java多线程_第1张图片

五 线程优先级

        线程优先级由1~10表示,1最低,默认优先级为5

        优先级高的线程获得CPU资源的概率较大

        但是这个优先级已经被淘汰了,基本上没有人设置这个使用,因为它太过不稳定,比如说优先级为 10 的可能都抢不过优先级为 1 的

package org.example.demo01;

public class Demo05 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"\t"+i);
        }
    }

    public static void main(String[] args) {
        Demo05 demo05 = new Demo05();

        Thread a1 = new Thread(demo05,"第一个线程");
        Thread a2 = new Thread(demo05,"第二个线程");

        System.out.println("默认的线程优先级:"+a1.getPriority());

        a1.setPriority(1);
        a2.setPriority(10);

        System.out.println("第一个线程优先级:"+a1.getPriority());
        System.out.println("第二个线程优先级:"+a2.getPriority());

        a1.start();
        a2.start();
    }
}

六 线程休眠

        核心要点:sleep()可以是线程阻塞【休眠】

package org.example.demo01;

public class Demo06 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i == 6){
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName()+"\t"+i);
        }
    }

    public static void main(String[] args) {
        Demo06 demo06 = new Demo06();
        Thread a1 = new Thread(demo06);
        a1.start();
    }
}

 

七 使用线程示例

同步代码块 synchronized

核心要点:在非集群状态下,使用synchronized可以保持线程的安全,如果是集群状态下,则synchronized会失效

package org.example.demo02;

public class Site implements Runnable{
    private int count = 100;
    private int num = 0;
    @Override
    public void run() {
        while (true){
            synchronized (Site.class) {
                if (count <= 0){
                    break;
                }
                num++;
                count--;
                System.out.println(Thread.currentThread().getName()+"抢到了第"+num+"张票,还剩"+count+"张票");
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
package org.example.demo02;

public class Test {
    public static void main(String[] args) {
        Site site = new Site();

        Thread thread1 = new Thread(site,"乔尼");
        Thread thread2 = new Thread(site,"杰洛");
        Thread thread3 = new Thread(site,"大总统");

        System.out.println("**************");
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

你可能感兴趣的:(java,开发语言)