前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程笔记(二)线程的3种创建方式,利用线程抢票的逻辑与代码

多线程笔记(二)线程的3种创建方式,利用线程抢票的逻辑与代码

作者头像
一写代码就开心
发布2021-08-24 10:30:47
3690
发布2021-08-24 10:30:47
举报
文章被收录于专栏:java和python

创建线程

在这里插入图片描述
在这里插入图片描述

继承Thread 类

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
class PrimeThread extends Thread {

    @Override
    public void run() {
        for(int i = 0; i<20;i++){
            System.out.println("我是多线程"+i);
        }

    }

    public static void main(String[] args) {

        PrimeThread primeThread = new PrimeThread();
        primeThread.start();

        for(int i = 0; i<200;i++){
            System.out.println("我是主线程"+i);
        }
    }
}

执行这个主函数,那么结果是 主线程和多线程是交替执行

在这里插入图片描述
在这里插入图片描述

每次执行的结果是不一样的,因为多线程是cpu进行调度的,看CPU心情。

线程开启之后,不是立马执行,必须要CPU进行调度才可以执行

实现Runnable 接口

代码语言:javascript
复制
public class Runnablejk  implements Runnable {


    @Override
    public void run() {
        for(int i = 0; i<20;i++){
            System.out.println("我是多线程"+i);
        }
    }

    public static void main(String[] args) {

        Runnablejk primeThread = new Runnablejk();
        Thread thread = new Thread(primeThread);
        thread.start();

        for(int i = 0; i<200;i++){
            System.out.println("我是主线程"+i);
        }
    }
}

利用线程抢票

思路

票的个数是一个对象,也就是多个线程操作一个对象,这一个对象就是一个线程类里面的run方法,多个线程都要执行这一个线程类里面的run方法

代码

代码语言:javascript
复制
public class qp implements Runnable {
    private int ticket = 10;

    @Override
    public void run() {
        while (true){
            if(ticket <0){
               break;
            }
            try {
                Thread.sleep(Long.parseLong("200"));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

                System.out.println(Thread.currentThread().getName()+"拿到了第"+ticket--+"票");


        }

    }

    public static void main(String[] args) {
        qp qp = new qp();
        Thread thread = new Thread(qp,"小红");
        Thread thread1 = new Thread(qp,"需");
        Thread thread2 = new Thread(qp,"uu");
        thread.start();
        thread1.start();
        thread2.start();
    }
}

创建3个线程,对同一个线程类进行跑,这个线程类里面就是对一个数字进行相减

有问题

在这里插入图片描述
在这里插入图片描述

都拿到了第一票,这个肯定是不对的

这个就是多线程的并发问题,操作同一个资源的时候,就会有这个并发问题

实现callable接口

实现callable接口,重写call方法,方法是有返回值的,这个方法里面写线程要执行的东西

代码语言:javascript
复制
public class callablejk  implements Callable {


    @Override
    public Boolean call() throws Exception {
        for(int i = 0; i<20;i++){
            System.out.println("我是多线程"+i);
        }
        return true;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        callablejk thread = new callablejk();
        callablejk thread1 = new callablejk();
        callablejk thread2 = new callablejk();

//        创建一个线程池
        ExecutorService executorService = Executors.newFixedThreadPool(3);
//        将我们创建的线程放到这个线程池里面,放到里面就可以执行了
        Future<Boolean> submit = executorService.submit(thread);
        Future<Boolean> submit1 = executorService.submit(thread1);
        Future<Boolean> submit2 = executorService.submit(thread2);
//获取执行的结果,不写也可以
        Boolean aBoolean = submit.get();
        Boolean aBoolean1 = submit1.get();
        Boolean aBoolean2 = submit2.get();

//        关闭服务
        executorService.shutdownNow();

    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建线程
  • 继承Thread 类
  • 实现Runnable 接口
  • 利用线程抢票
    • 思路
      • 代码
      • 实现callable接口
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档