多线程

多线程

2024-06-15  本文已影响0人  星汉西流_夜未央

线程

进程

多线程及其应用场景

多线程就是系统同时执行多个线程的操作, 可以提高工作效率

并发和并行

多线程的实现方式

  1. 继承Thread类, 重写run方法
public class MyThread extends Thread{
    @Override
    public void run(){
        //书写线程需要执行的代码
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + "HelloWord");
        }
    }
}

测试类中的测试代码

        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();

        t1.setName("线程1");
        t2.setName("线程2");
        
        t1.start();
        t2.start();
//线程1和线程2的run方法会交替进行
  1. 实现Runnable接口, 重写run方法, 要将该类的对象传递到Thread类的对象中
public class MyRun implements Runnable{
    @Override
    public void run() {
        //由于没有继承Thread类, 无法直接使用getName方法
        //可以使用Thread类中的静态方法currentThread, 该方法由哪个线程调用, 就返回该线程的对象
        Thread t = Thread.currentThread();
        for (int i = 0; i < 100; i++) {
            System.out.println(t.getName() + "HelloWorld");
        }
    }
}
        //创建MyRun对象, 该对象就表示后续线程要完成的任务
        MyRun mr = new MyRun();
        //创建Thread对象, 并将mr传递过去
        Thread t1 = new Thread(mr);
        Thread t2 = new Thread(mr);
        //方便看清结果,设置名字
        t1.setName("线程1");
        t2.setName("线程2");
        //开启线程
        t1.start();
        t2.start();
//部分结果
//线程2HelloWorld
//线程1HelloWorld
//线程2HelloWorld
//线程1HelloWorld
//线程2HelloWorld
//线程1HelloWorld
  1. 利用Callable接口和Future接口方式实现, 重写call方法
public class MyCallable implements Callable<Integer> {
    //Callable接口为泛型接口, call方法的返回值即为线程运行完之后的结果
    //返回值的类型就是实现Callable接口时所给定的类型
    @Override
    public Integer call() throws Exception {
        //计算1~100的和
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        return sum;
    }
}
        //创建MyCallable对象, 表示线程要完成的任务
        MyCallable mc = new MyCallable();
        //创建Future接口的对象, 用于管理多线程的结果
        //由于接口无法直接创建对象, 所以我们需要创建Future实现类FutureTask的对象
        //并将任务对象传递过去
        FutureTask<Integer> ft = new FutureTask<>(mc);
        //创建Thread的对象, 并将FutureTask对象传递过去
        Thread t = new Thread(ft);
        //启动线程
        t.start();

        //获取线程的结果
        Integer result = ft.get();
        System.out.println(result);//5050
多线程三种实现方式对比.png

多线程常见的成员方法

常见成员方法.png
        //没有设置优先级的情况下, 线程的优先级默认为5
        //优先级越高, 表示该线程被执行的概率越高, 但不代表一定最先完成该线程
        Thread t = Thread.currentThread();
        System.out.println(t.getPriority());//5
        System.out.println(t1.getPriority());//5
        System.out.println(t2.getPriority());//5
        t1.setPriority(1);
        t2.setPriority(10);
        //可以设置线程的优先级
        //创建两个任务对象
        MyThread t1 = new MyThread();
        MyThread1 t2 = new MyThread1();

        t1.setName("云想衣裳花想容");
        t2.setName("星汉西流夜未央");

        //设置t2为守护线程
        t2.setDaemon(true);

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

线程的生命周期

线程的生命周期.png

线程的安全问题

synchronized (锁对象){
}      //锁对象是任意的, 但必须是唯一的, 通常写当前类的字节码文件, 例如MyThread.class
对于锁

生产者和消费者(等待唤醒机制)

线程的完整状态

线程的完整状态.png

实际Java中线程只有6种状态, 没有定义运行状态

上一篇 下一篇

猜你喜欢

热点阅读