Java 多线程

多线程

线程三种方式

  • 继承Thread类

    • 子类继承Thread类具备多线程能力
    • 启动线程: 子类对象.start();
    • 不建议使用: 避免OOP单线程局限
//创建线程方式一:继承Thread类,重写run方法,调用start开启线程
public class TestThread1 extends Thread{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看代码---"+i);
        }
    }

    public static void main(String[] args) {
        //main线程 主线程
        //创建一个线程对象
        TestThread1 testThread1 = new TestThread1();
        //调用start()方法,开启线程
        testThread1.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("我在学线程---"+i);
        }
    }
}
  • 实现Runnable接口

    • 重写run方法

    • 实现接口Runnable具有多线程能力

    • 启动线程:传入目标对象+Thread对象.start()

    • 推荐使用:避免单继承局限性,理货方便,方便同一个对象被多个线程使用

//创建线程方式2:实现runnable接口,重写run方法,执行线程需要丢入
//runnable接口实现类,调用start方法
public class TestThread2 implements Runnable{
    @Override
    public void run() {
        //run方法
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看代码---" + i);
        }
    }

    public static void main(String[] args) {
        TestThread2 testThread2 = new TestThread2();
        //创建线程。丢入runnable接口实现类
        new Thread(testThread2).start();
        for (int i = 0; i < 20; i++) {
            System.out.println("我在学线程---" + i);
        }
    }
}

买火车票的例子

//多个线程同时操作同一个对象
//卖火车票的例子

import javax.sound.midi.Soundbank;

//发现问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱
public class TestThread2_1 implements Runnable{
    private int ticknetNum = 10;
    @Override
    public void run() {
       while (true) {
           if(ticknetNum <= 0) {
               break;
           }
           //模拟延迟
           try {
               Thread.sleep(200);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
           System.out.println(Thread.currentThread().getName() + "--->拿到了第" + ticknetNum-- + "票");
       }
    }

    public static void main(String[] args) {
        TestThread2_1 ticket = new TestThread2_1();


        new Thread(ticket,"小米").start();
        new Thread(ticket,"老师").start();
        new Thread(ticket,"黄牛").start();
    }
}
  • 实现Callable接口

    1. 实现Callable接口,需要返回值类型
    2. 重写call方法,需要抛出异常
    3. 创建目标对象 TestCalled t1 = new TestCalled();
    4. 创建执行服务:ExecutorService ser = Executor.newFixedThreadPool(1);//线程池大小
    5. 提交执行:Future result1 = ser.submit(t1);
    6. 获取结果:boolean r1 = result.get()
    7. 关闭服务:ser.shutdownNow();
      • 好处
        • 可以定义返回值
        • 可以抛出异常
posted @ 2022-03-21 16:10  NeverGGp  阅读(20)  评论(0)    收藏  举报