JAVA 多线程(二)

102 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

方式一: 继承Thread类

# main
public static void main(String[] args) {
    // 2. 创建Thread或者Thread子类对象
    MyThread mythread = new MyThread();
     // 3.调用Thread类中的start方法,开启新线程,执行run方法
  
  mythread.start();
    
    // 主线程会继续执行主方法中的代码
    for (int i = 0; i < 10; i++) {
        System.out.println("main" + i);
    }
}

# 输出
main0
run0
main1
main2
main3

方式二:实现Runnable接口:

// 1. 创建一个Runnable接口的实现类
public class RunnableImpl implements Runnable {
    // 2. 重写Runnable中的run方法
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + i);
        }
    }
}

# main
public static void main(String[] args) {
    // 3. 创建Runnable接口的实现类对象
    Runnable runable = new RunnableImpl();
    // 4. 创建Thread类对象,构造方法中传递Runnable接口的实现类
    Thread thread1 = new Thread(runable);
    // 5. 开启新线程
    thread1.start();
    
    // 链式编程:简化接口的方式
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + "--->" + "程序员");
        }
    }).start();
}

Thread和Runnable的区别

  1. 适合多个相同的程序代码的线程去共享同一个资源
  2. 可以避免java中的单继承的局限性。
  3. 线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。

线程停止

1.run任务运行完自动停止 2.使用变量来控制run方法使线程停止,即通知方式

// 通知方式
public class Demo02RunnableStop {
    public static void main(String[] args) throws InterruptedException {
        T t = new T();
        Thread thread = new Thread(t);
        thread.start();
        
        Thread.sleep(5000);
        t.setLoop(false);
    }
}

class T implements Runnable {
    private Boolean loop = true;
    int count = 1;
    
    public void setLoop(Boolean loop) {
        this.loop = loop;
    }
    @Override
    public void run() {
        while (loop) {
            try {
                System.out.println("T 运行中。。。" + count);
                Thread.sleep(2000);
                count++;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

线程中断

interrupt, 中断线程,但并没有真正的结束线程。所以一般用于中断正在休眠的线程

线程插队

  • yield:线程让步。让出CPU,让其他线程执行,但礼让的时间不确定,所以不一定礼让成功。