java线程实现

Java学习笔记

Posted by DM on October 24, 2024

创建线程的几种方式:

  • 1、继承线程类 Thread
  • 2、实现Runnable接口
  • 3、实现Callable接口
  • 4、线程池

1. 继承线程类 Thread

public class Mythread extends Thread {
    // 从学习的角度来说, 线程是一个完成任务的类
    public void run() {// eg: 线程任务:从1-100输出
        for (int i = 0; i < 10; i++) {
            System.out.println(Mythread.currentThread() + "-" + i);
        }
    }
}

注意⚠️: 线程的开启:注意线程的任务是写在线程的run方法里面,但是执行的线程任务要写在start方法 run 不会开启子线程,start才会开启子线程 [Mythread run] //只会在主线程中执行 [Mythread start]//当前自定义的线程执行

2.实现Runnable接口

public class Mythread implements Runnable {
    // 从学习的角度来说, 线程是一个完成任务的类
    public void run() {// eg: 线程任务:从1-100输出
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread() + "-" + i);
        }
    }
}

//调用
        Mythread mythread1 = new Mythread();
        Thread th = new Thread(mythread1);
        Thread th2 = new Thread(mythread1);
        th.start();
        th2.start();
        System.out.println(th);
        System.out.println(th2);

继承Thread类和实现Runnable接口,我们推荐使用第二种方案,原因:

  • 1.继承是单根性,如果一个类已经有父类,那么这个类就不能再继承Thread这类
  • 2.实现接口能方便各个线程对象共享数据

3、线程调度

为什么需要线程调度? 咱们创建多个线程之后,线程之间的执行顺序不受控制了,我们又希望某些时候可以控制部分线程 顺序 setPriority(1-10) 这是一个概率。优先级越高,执行概率越高 setName():修改线程名字 也可以通过构造函数修改,如果是继承类,咱们自己写构造函数来构造名字,构造函数中去调用父类构造 public MythreadExt(String name){ super(name); } 如果是实现接口,那么在new Thread()对象的时候就直接把名字给构造就行了,因为Thread类提供了构造线程名字的方法

        Mythread mythread = new Mythread("kkkfff");
        mythread.start();
        System.out.println(mythread);

Thread.sleep():静态方法—线程休眠 ⭐️注意线程休眠是线程释放cpu, 但是不释放锁 Thread.yield():线程礼让,他会释放cpu,但是不会等待,立马会又去竞争cpu资源,如果抢到了,还会继续执行

4、线程的生命周期

线程的使用:
    建线程类----> 建线程对象 ---->start()---->run()--->结束
线程的生命周期:
    新建: new 线程对象()
    就绪: start()方法---- 就绪之后要等着cpu
    运行: run()
    阻塞: 运行的时候要去读数据库,或者要等用户输入
    结束: run方法执行完毕